Una advertencia no trivial de Visual Studio 2010 (C ++) me ha golpeado en la cabeza (bastante difícilmente).
La compilación dio el siguiente resultado:
1 Debug \ is.obj: advertencia LNK4042: objeto especificado más de una vez; extras ignorados
1 Debug \ make.obj: advertencia LNK4042: objeto especificado más de una vez; extras ignorados
1 Debug \ view.obj: advertencia LNK4042: objeto especificado más de una vez; extras ignorados
1 identity.obj: error LNK2019: símbolo externo no resueltovoid __cdecl test::identity::view(void)
(? view @ identity @ test @@ YAXXZ) referenciado en la funciónvoid __cdecl test::identity::identity(void)
(? identity @ 0test @@ YAXXZ)
1 identity.obj: error LNK2019: símbolo externo no resueltovoid __cdecl test::identity::make(void)
(? make @ identity @ test @@ YAXXZ) referenciado en la funciónvoid __cdecl test::identity::identity(void)
(? identity @ 0test @@ YAXXZ)
1 range.obj: error LNK2019: símbolo externo no resueltovoid __cdecl test::range::is(void)
(? is @ range @ test @@ YAXXZ) referenciado en la funciónvoid __cdecl test::range::range(void)
(? range @ 0test @@ YAXXZ)
Los errores del vinculador son siempre difíciles de depurar ... pero había referencias sin resolver, así que verifiqué ... pero la fuente está bien formada ... y finalmente me di cuenta:
Mi jerarquía de carpetas se ve así:
src/
identity/
is.cpp
make.cpp
view.cpp
range/
is.cpp
make.cpp
view.cpp
y también lo hace la jerarquía en la Solución (siempre la configuro para que imite la estructura de carpetas "real").
Y las salidas de diagnóstico:
Debug\is.obj
Debug\make.obj
Debug\view.obj
Junto con una advertencia que dice que .obj
se ha pasado dos veces al enlazador y que se ignorará.
No busque más: Visual ha aplanado perfectamente la jerarquía de mi carpeta y, por lo tanto, no puede compilar perfectamente el código fuente.
Por el momento, simplemente estoy pensando en cambiar el nombre de los archivos, eso debería cubrir el problema ...
... pero ¿hay alguna manera de que Visual Studio NO apile la jerarquía de archivos?