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 68

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.

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

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

иди к своему .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.