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)
(?view@identity@test@@YAXXZ) ссылка в функцииvoid __cdecl test::identity::identity(void)
(?identity@0test@@YAXXZ)
1 личность.obj: ошибка LNK2019: неразрешенный внешний символvoid __cdecl test::identity::make(void)
(?make@identity@test@@YAXXZ) ссылка в функцииvoid __cdecl test::identity::identity(void)
(?identity@0test@@YAXXZ)
Диапазон 1.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
так же как и иерархия в решении (я всегда настраиваю ее так, чтобы она имитировала "реальную" структуру папок).
и диагностические выходы:
Debugis.obj
Debugmake.obj
Debugview.obj
вместе с предупреждением, в котором говорится, что .obj
было передано дважды компоновщику, и это будет проигнорировано.
поиск не более: визуальный и аккуратно расплющить мою иерархию папок, и, следовательно, не в состоянии аккуратно скомпилировать исходный код.
на данный момент я просто думаю о переименовании файлов, которые должны охватывать эту проблему...
... но есть ли способ, чтобы 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-проекты для файлов в идентификаторе и диапазоне. Обычно делается в проектах makefile, например. Однако это делает управление настройками компиляции и ссылок более сложным, если вы не используете таблицы свойств проекта.
щелкните правой кнопкой мыши на заголовочном файле - > свойство - > ItemType (выберите заголовок C/C++). Сделайте то же самое с Cpp-файлом, но выберите компилятор C/C++ (это работа для меня)
У меня была эта проблема с stdafx.СРР. Как-то stdafx.СРР получил дублируются, значит есть второй файл stdafx.cpp (обратите внимание на другой случай).
после того, как я удалил StdAfx.СРР все работало нормально!
использование VS 2010.
В качестве альтернативы удалению и созданию нового файла вы можете изменить настройки компиляции/включения.
иди к своему .vcxproj файл, откройте его с помощью редактора, найдите строку html like
<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.