Visual Studio 2010 странное " предупреждение LNK4042"

меня только что избили (довольно редко) по голове каким-то нетривиальным предупреждением из Visual Studio 2010 (C++).

компиляция дала следующий результат:

1 Debugis.obj: предупреждение LNK4042: объект указан более одного раза; дополнительно игнорируется
1 Debugmake.obj: предупреждение LNK4042: объект указан более одного раза; дополнительно игнорируется
1 отладкапросмотр.obj: предупреждение LNK4042: объект указан более одного раза; дополнительно игнорируется
Один тождественность.obj: ошибка LNK2019: неразрешенный внешний символ void __cdecl test::identity::view(void) (?посмотреть@identity@test@@YAXXZ) ссылка в функции void __cdecl test::identity::identity(void) (?identity@0test@@YAXXZ)
1 личность.obj: ошибка LNK2019: неразрешенный внешний символ void __cdecl test::identity::make(void) (?сделать@identity@test@@YAXXZ) ссылка в функции void __cdecl test::identity::identity(void) (?identity@0test@@YAXXZ)
Диапазон 1.obj: ошибка LNK2019: неразрешенный внешний символ void __cdecl test::range::is(void) (?является@range@test@@YAXXZ) ссылка в функции void __cdecl test::range::range(void) (?диапазон@0test@@YAXXZ)

ошибки компоновщика всегда являются болью для отладки... но остались нерешенные вопросы, и я проверил... но источник хорошо сформирован... и наконец меня осенило:--10-->

моя иерархия папок выглядит так:

src/
  identity/
    is.cpp
    make.cpp
    view.cpp
  range/
    is.cpp
    make.cpp
    view.cpp

и иерархия в решении (я всегда настраиваю ее так, чтобы она имитировала "реальную" структуру папок).

и диагностические выходы:

Debugis.obj
Debugmake.obj
Debugview.obj

вместе с предупреждением, которое говорит, что .obj было передано дважды компоновщику, и это будет проигнорировано.

Поиск больше нет: Visual аккуратно сглаживает иерархию папок и поэтому не может аккуратно скомпилировать источник.

на данный момент я просто думаю о переименовании файлов, которые должны охватывать эту проблему...

... но есть ли способ, чтобы Visual Studio не сглаживала иерархию файлов ?

8 ответов


просто хотел пересечь сообщение, которое я считаю ответом, если вы откроете свойства для всего проекта и измените значение под C/C++ -> Output Files -> "Object File Name" следующий:

$(IntDir)/%(RelativeDir)/

в VS 2010 я считаю, что это устранит неоднозначность всех объектных файлов (поскольку я считаю, что windows не позволит вам ни при каких сумасшедших обстоятельствах иметь два файла с одинаковыми именами в одном каталоге). Также, пожалуйста, проверьте детали здесь.


у меня была аналогичная проблема с предупреждением компоновщика LNK4042: объект указан более одного раза; дополнительно игнорируется. В моем случае Visual Studio пыталась скомпилировать как заголовочные, так и исходные файлы с одинаковым именем - MyClass.h и MyClass.cpp. Это произошло потому, что я переименовал до .h и Visual Studio запутался. Я заметил проблему, посмотрев журналы компилятора в


щелкните правой кнопкой мыши .cpp-файл в окне обозревателя решений, свойства, C / C++, выходные файлы, настройка имени файла объекта. Значение по умолчанию:$(IntDir)\, вот что делает сплющивания. Все.obj-файл перейдет в $(IntDir), каталог" Debug " в конфигурации отладки.

вы можете изменить настройки, скажем $(IntDir)\is2.obj. Или выберите все файлы из одной группы (используйте Shift+Click) и измените настройку, скажем, $(IntDir)\identity\

или вы можете изменить .СРР именем так что.obj файлы не перезаписывают друг друга. Наличие файлов с одинаковым именем в двух каталогах немного странно.

или вы можете создать несколько проектов, создавая, скажем, .lib проекты для файлов в identity и range. Обычно делается в проектах makefile, например. Это, однако, делает управление настройками компиляции и ссылок более хлопотным, если вы не используете листы свойств проекта.


щелкните правой кнопкой мыши файл заголовка - > свойство - > ItemType (выберите заголовок C/C++). Сделайте то же самое с Cpp-файлом, но выберите компилятор C/C++ (это работа для меня)


У меня была эта проблема с stdafx.СРР. Как-то stdafx.cpp был дублирован, поэтому был второй StdAfx.cpp (обратите внимание на другой случай).

после того, как я удалил StdAfx.СРР все работало нормально!

использование VS 2010.


Я использую $(IntDir)\%(Directory)\ под C/C++ -> выходные файлы -> "имя файла объекта".


В качестве альтернативы удалению и созданию нового файла вы можете изменить настройки компиляции/включения.

перейти к вашей .расширением vcxproj файл, откройте его с помощью редактора, найдите html как line <ItemGroup>.

Это должно выглядеть примерно так:

<ItemGroup>
<ClCompile Include="implementation.cpp" />
</ItemGroup>

и

<ItemGroup>
<ClInclude Include="declaration.hpp" />
</ItemGroup>`

предполагая, что ваши файлы реализации .cpp и ваши декларации .ТЭЦ. Убедитесь, что все ваши файлы реализации перечислены между первым разделом, если у вас есть более одного, а также для второго раздела для нескольких файлов деклараций.


раньше у меня был в том же проекте .c и .cpp файлы те же имена. Файлы были в папках повсюду, и решения, предоставленные другими, создали беспорядок, и папка ад (в моем случае). Даже релиз сборки перезапишут Debug строит!

хорошим (не идеальным) решением было бы использовать $(ParentName), но по какой-то причине он был удален из более поздней версии версии Visual Studio (2015+).

то, что я использую успешно сейчас: $(IntDir)%(Filename)%(Extension).параметр obj

, который, по крайней мере, отделяет .c встроенные объектные файлы из .cpp.