Visual Studio - поиск того, какие модули вызывают C1905 (несовместимость процессора)

Я пытаюсь создать x64-проект проекта с Visual Studio 2005. В настоящее время он не работает с ошибкой компоновщика C1905, "Front end и back end несовместимы (должны быть нацелены на тот же процессор).

Из того, что я собираю, это, по сути, говорит о том, что моя сборка x64 пытается связать с модулями x86. К сожалению, этот проект связан с много разных библиотек. Я не уверен, какой из них вызывает проблему.

Есть ли способ получить больше информации из Visual Studio?

Ответ 1

Сначала проверьте Configuration Manager (Build > Configuration Manager...), чтобы убедиться, что вы строите все свои проекты для одной и той же платформы.

Если это не помогает, то из командной строки Visual Studio (доступно из меню "Пуск" ) вы можете использовать dumpbin для определения архитектуры ваших файлов .lib и .obj, выполнив следующие действия:

C:\Foo> dumpbin /headers Foo.lib | more
Microsoft (R) COFF/PE Dumper Version 10.00.30319.01
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file Foo.lib

File Type: LIBRARY

FILE HEADER VALUES
             14C machine (x86)
               3 number of sections
        4C6CB9B6 time date stamp Wed Aug 18 21:57:26 2010
             113 file pointer to symbol table
               8 number of symbols
               0 size of optional header
             100 characteristics
                   32 bit word machine

Первая строка под значениями заголовка сообщает вам, в какой архитектуре был скомпилирован файл .lib/.obj(в данном случае x86).

Если у вас много связанных промежуточных элементов, вы можете автоматизировать это немного, просто ищем файлы x86 (или x64):

for /R %f in (*.obj *.lib) do @echo %f && dumpbin /headers %f | findstr /c:"machine (x86)"

Ответ 2

Другая причина - флаги компиляции. Если некоторые из них не настроены для оптимизации всей программы, а другие нет, то вы также получите эту ошибку. В VS есть две такие настройки - одна на общем уровне и одна на C++/Оптимизация. В библиотеках, выпущенных более старыми версиями VS, этот набор отсутствовал. Те, что созданы в более новых версиях VS, имеют его.

Единственный способ обнаружить нарушающие библиотеки - снимать их по одной, пока ошибка не исчезнет.