Странное «предупреждение LNK4042» в Visual Studio 2010
Меня только что избили (довольно сильно) по голове каким-то нетривиальным предупреждением из Visual Studio 2010 (C ++).
Компиляция дала следующий вывод:
1 Debug \ is.obj: предупреждение LNK4042: объект указан более одного раза; дополнения игнорируются
1 Debug \ make.obj: предупреждение LNK4042: объект указан более одного раза; дополнения игнорируются
1 Debug \ view.obj: предупреждение LNK4042: объект указан более одного раза; дополнения игнорируются
1 identity.obj: ошибка LNK2019: неразрешенный внешний символvoid __cdecl test::identity::view(void)
(? view @ identity @ test @@ YAXXZ) упоминается в функцииvoid __cdecl test::identity::identity(void)
(? Тождественное @ 0test @@ YAXXZ)
1 identity.obj: ошибка LNK2019: неразрешенный внешний символvoid __cdecl test::identity::make(void)
(? make @ identity @ test @@ YAXXZ) упоминается в функцииvoid __cdecl test::identity::identity(void)
(? Тождественное @ 0test @@ YAXXZ)
1 range.obj: ошибка LNK2019: неразрешенный внешний символvoid __cdecl test::range::is(void)
(? is @ range @ test @@ YAXXZ) ссылка на функциюvoid __cdecl test::range::range(void)
(? Диапазон @ 0test @@ YAXXZ)
Ошибки компоновщика всегда трудны для отладки ... но были неразрешенные ссылки, и поэтому я проверил ... но источник хорошо сформирован ... и, наконец, он поразил меня:
Моя иерархия папок выглядит так:
src/
identity/
is.cpp
make.cpp
view.cpp
range/
is.cpp
make.cpp
view.cpp
как и иерархия в решении (я всегда настраивал ее так, чтобы она имитировала «настоящую» структуру папок).
И диагностические выводы:
Debug\is.obj
Debug\make.obj
Debug\view.obj
Вместе с предупреждением о том, что.obj
был дважды передан компоновщику, и этот будет проигнорирован.
Больше не нужно искать: Visual аккуратно сгладил иерархию папок и поэтому не может аккуратно скомпилировать исходный код.
На данный момент я просто думаю о переименовании файлов, которые должны охватить проблему ...
... но есть ли способ, чтобы Visual Studio НЕ сгладил иерархию файлов?