I've just been beaten (rather hardly) on the head by some non-trivial warning from Visual Studio 2010 (C++).
The compilation gave the following output:
1 Debug\is.obj : warning LNK4042: object specified more than once; extras ignored
1 Debug\make.obj : warning LNK4042: object specified more than once; extras ignored
1 Debug\view.obj : warning LNK4042: object specified more than once; extras ignored
1 identity.obj : error LNK2019: unresolved external symbolvoid __cdecl test::identity::view(void)
(?view@identity@test@@YAXXZ) referenced in functionvoid __cdecl test::identity::identity(void)
(?identity@0test@@YAXXZ)
1 identity.obj : error LNK2019: unresolved external symbolvoid __cdecl test::identity::make(void)
(?make@identity@test@@YAXXZ) referenced in functionvoid __cdecl test::identity::identity(void)
(?identity@0test@@YAXXZ)
1 range.obj : error LNK2019: unresolved external symbolvoid __cdecl test::range::is(void)
(?is@range@test@@YAXXZ) referenced in functionvoid __cdecl test::range::range(void)
(?range@0test@@YAXXZ)
Linker errors are always a pain to debug... but there were unresolved references, and so I checked... but the source is well-formed... and finally it hit me:
My folder hierarchy looks like so:
src/
identity/
is.cpp
make.cpp
view.cpp
range/
is.cpp
make.cpp
view.cpp
and so does the hierarchy in the Solution (I always set it up so that it mimicks the "real" folder structure).
And the diagnostic outputs:
Debug\is.obj
Debug\make.obj
Debug\view.obj
Along with a warning which says that the .obj
has been passed twice to the linker and that one will be ignored.
Search no more: Visual has neatly flatten my folder hierarchy, and therefore is unable to neatly compile the source.
At the moment, I am simply thinking of renaming the files, that should cover the issue...
... but is there a way to have Visual Studio NOT flatten the file hierarchy ?
I use $(IntDir)\%(Directory)\ under C/C++ -> Output Files -> "Object File Name".
I had a similar problem with linker warning LNK4042: object specified more than once; extras ignored. In my case Visual Studio was trying to compile both header and source files with the same name -
MyClass.h
andMyClass.cpp
. It happened because I renamed.cpp
file to.h
and Visual Studio got confused. I noticed the problem by looking at the compiler logs in theDebug
directory. To resolve just remove.h
file from the project then add it again.