Меня только что избили (довольно сильно) по голове каким-то нетривиальным предупреждением из 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)
(? Identity @ 0test @@ YAXXZ)
1 identity.obj: ошибка LNK2019: неразрешенный внешний символ void __cdecl test::identity::make(void)
(? Make @ identity @ test @@ YAXXZ), указанный в функции void __cdecl test::identity::identity(void)
(? Identity @ 0test @@ YAXXZ)
1 range.obj: ошибка LNK2019: неразрешенный внешний символ void __cdecl test::range::is(void)
(? Is @ range @ test @@ YAXXZ), указанный в функции void __cdecl test::range::range(void)
(? Range @ 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 НЕ сгладить иерархию файлов?