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.
В качестве альтернативы удалению и созданию нового файла вы можете изменить настройки компиляции/включения.
перейти к вашей .расширением 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.