Фатальная ошибка LNK1112: тип компьютера модуля "x64" конфликтует с типом машины назначения "X86"
Я использую CUDA (VC++, Visual studio 2008sp1) для отладки программы FEM. Программа может работать только на платформе Win32, из-за недостатка cuda. Я думаю, что все связанные библиотечные файлы скомпилированы на платформе x86, но когда я скомпилирую их, я получаю сообщение об ошибке "Неустранимая ошибка LNK1112: тип машины модуля" x64 "конфликтует с типом целевой машины" X86 "".
Я пытался преобразовать платформу в x64, но это не сработало. Скажите, пожалуйста: что такое "тип машины модуля" и что такое "тип машины цели"? Как я могу преодолеть это?
30 ответов
Я написал запись в блоге об этом, когда столкнулся с этой сводящей с ума проблемой, и наконец вернул мою систему в рабочее состояние.
Вот что нужно проверить в следующем порядке:
Проверьте параметры свойств в настройках компоновщика по адресу: Свойства> Свойства конфигурации> Компоновщик> Дополнительно> Целевой компьютер. Выберите MachineX64, если вы используете 64-битную сборку, или MachineX86, если вы делаете 32-битную сборку.
Выберите Build > Configuration Manager из главного меню в Visual Studio. Убедитесь, что в вашем проекте указана правильная платформа. Возможно, для среды IDE будет установлена сборка x64, но для отдельного проекта в решении может быть задано целевое значение win32. Так что да, визуальная студия оставляет много веревки, чтобы повеситься, но это жизнь.
Проверьте файлы своей библиотеки, что они действительно относятся к тому типу платформы, на который нацелены. Это можно использовать с помощью dumpbin.exe, который находится в каталоге Visual Studio VC\bin. используйте опцию -headers, чтобы сбросить все ваши функции. Ищите запись машины для каждой функции. он должен включать x64, если это 64-битная сборка.
В Visual Studio выберите Инструменты> Параметры в главном меню. выберите Проекты и решения> Каталоги VC++. Выберите x64 из раскрывающегося списка Платформа. Убедитесь, что первая запись: $ (VCInstallDir) \ bin \ x86_amd64, за которой следует $ (VCInstallDir) \ bin.
Как только я сделал шаг 4, все снова заработало для меня. Дело в том, что я сталкивался с этой проблемой во всех моих проектах, где я хотел скомпилировать в направлении 64-битной цели.
В дополнение к списку С. Джонсона я бы добавил следующее:
Проверьте в Visual Studio:
Свойства проекта -> Свойства конфигурации -> Линкер -> Командная строка.
"Дополнительные параметры" не должны содержать /machine:X86
У меня есть такой ключ, сгенерированный выводом CMake: CMake сгенерировал проект x86, затем я добавил платформу x64 через Configuration Manager
в Visual Studio 2010 - все было прекрасно создано для новой платформы, кроме указанной командной строки компоновщика /machine:X86
по отдельности.
Я столкнулся с той же проблемой в VS2008, когда пытался добавить сборку X64 в проект, преобразованный из VS2003.
Я посмотрел на все, что было найдено при поиске этой ошибки в Google (целевой компьютер, каталоги VC++, DUMPBIN....), и все выглядело нормально.
Наконец, я создал новый тестовый проект и сделал те же изменения, и это, похоже, сработало.
Выполнение различий между файлами vcproj выявило проблему....
В моем преобразованном проекте /MACHINE:i386 был установлен в качестве дополнительной опции в Linker->Command Line. Таким образом, было установлено два параметра / MACHINE (как x64, так и i386), и дополнительный выбрал предпочтение.
Удаление и правильная настройка в Linker->Advanced->Target Machine позволили устранить проблему.
Все настройки проекта казались идеальными, но я все еще получил ошибку. Глядя в .vcxproj
файл и поиск "x86" выявили проблему:
<Lib>
<AdditionalOptions> /machine:X86 %(AdditionalOptions)</AdditionalOptions>
</Lib>
Быстрый поиск / замена всех вхождений (десять отдельных настроек файла) устранили проблему.
Вероятно, у вас есть один файл.OBJ или.LIB, предназначенный для x64 (это тип компьютера модуля), а вы связываете для x86 (это тип целевой машины).
Используйте DUMPBIN /HEADERS для ваших файлов.OBJ и проверьте наличие записи машины в блоке FILE HEADER VALUES.
Поскольку проблема связана с различием в спецификации компиляции и целевой машины (x86 и x64), выполните следующие действия:
- Откройте проект C++, который вы хотите настроить.
- Нажмите кнопку Configuration Manager, чтобы открыть диалоговое окно Configuration Manager.
- В раскрывающемся списке Active Solution Platform выберите параметр, чтобы открыть диалоговое окно New Solution Platform.
- В раскрывающемся списке Тип или выберите новую платформу выберите 64-разрядную платформу.
Это решило мою проблему.
В Visual Studio 2012 +/- страница свойств для "Свойства конфигурации". Линкер. "Командная строка" содержит поле с надписью "Дополнительные параметры". Если вы собираете x64, убедитесь, что в этом поле нет /MACHINE:I386. Мои проекты сделали, и это вызвало ошибку, о которой идет речь.
Я сталкивался с этой проблемой при сборке QT. Инструкции, которые я где-то читал, предложили мне настроить nmake с помощью командной строки VS.
Я выбрал командную строку x64 и выполнил настройку без особых хлопот. Когда я попробовал nmake, он выдал эту ошибку.
Я думаю, что некоторые компоненты были предварительно собраны для 32-разрядных. Ошибка даже сообщила, какие модули были построены для x86.
Я использовал 32-битную командную строку VS по умолчанию, и она работала.
Моя цель - приложение DOSBox в текстовом режиме x64 Windows 10 на языке C. Использование "Visual Studio 2019 Community" для компиляции через приглашение DOS "nmake -f makefile". Ошибка аналогична, но с противоположной стороны:
fatal error LNK1112: module machine type 'x32' conflicts with target machine type 'X64'
Можно скомпилировать с помощью VC++ 2010 на другом компьютере. Но на этом компьютере произошла ошибка "Сообщества Visual Studio 2019". Итак, мои настройки верны, и все приведенные выше ответы не работают.
Я хотел бы поделиться с вами, что решение - это make.bat вроде этого:
call "c:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"
nmake -f makefile
Вы найдете много других vcvarsxxxx.bat, только это одно слово.
"project property - CUDA Runtime API - GPU - NVCC Compilation Type"
Установите 64-битную опцию компиляции -m64 -cubin
Подсказка при компиляции журнала. Как это:
nvcc.exe ~~~~~~ -machine 32 -ccbin ~~~~~
Тот "-machine 32"
это проблема.
Сначала задайте опцию 64-битной компиляции, затем снова установите опцию гибридной компиляции. Тогда ты сможешь увидеть успех.
В Visual Studio 2013
1) Проверьте в страницах свойств проекта / свойства конфигурации / компоновщик / все параметры и исправьте все неправильно настроенные машины и каталоги.
2) Проверьте в страницах свойств проекта / свойства конфигурации / компоновщик / ввод и исправьте все пропущенные настроенные каталоги.
Смотрите пример 1)
Если ваше решение имеет проекты lib, проверьте свойство Target Machine в Property->Librarian->General
Файл vcxproj может содержать 'MACHINE:i386' Редактировать файл vcxproj с помощью редактора. убери это!
Я использовал CMake и затем добавил конфигурацию win32. Страница свойств показала x86, но на самом деле при открытии файла vcxproj в текстовом редакторе это был x64! Ручное переключение на x86 решило эту проблему.
Прежде всего попробуйте сделать следующее: 1. Перейдите в диспетчер конфигурации и создайте новый x64, если его там еще нет. 2. выберите решение x64. 3. Перейдите в свойства проекта и затем Linker->Advanced выберите x64 machine. 4. Теперь перестройте решение.
Если все еще вы получаете ту же ошибку. попробуйте чистое решение, а затем перестройте заново и откройте Visual Studio, вы получите список недавно открытых проектов, щелкните правой кнопкой мыши проект и удалите его оттуда. Теперь перейдите к решению и снова откройте решение.
Это очень разочаровывающая и раздражающая проблема, но как только вы ее поймете, это будет довольно просто: в вашей сборке есть какой-то элемент, который строит один тип архитектуры (в вашем случае x64), несмотря на тот факт, что он предназначен для другого типа (скажем, x86).).
Вы можете проанализировать источник вашей проблемы, посмотрев, какой файл obj вызывает сбой, и начать искать там проблему. Каждый объект будет иметь аналог исходного кода: либо в cpp, c, asm и т. Д. Вокруг него могут быть специальные события сборки, использующие неправильный инструмент. Проверьте это в списках свойств.
Я бы посмотрел там сначала, прежде чем перейти к списку вещей, которые должен сделать C Johnson.
В моем случае установка переменной среды
PROCESSOR_ARCHITECTURE
к
AMD64
исправил проблему.
https://social.msdn.microsoft.com/Forums/en-US/f9303904-81ce-405d-85b3-b66d97e49971
Это случилось со мной сегодня, потому что я добавил каталог библиотеки еще в режиме x86 и случайно удалил унаследованные каталоги, вместо этого сделав их жестко закодированными. Затем после перехода на x64 мои каталоги VC++ все еще читают:
"...; $ (VC_LibraryPath_x86); $ (WindowsSDK_LibraryPath_x86);"
вместо _x64.
В дополнение к списку Джонсон, также проверьте папки библиотеки
В Visual Studio выберите Инструменты> Параметры в главном меню. выберите Проекты и решения> Каталоги VC++. Выберите x64 из раскрывающегося списка Платформа.
$(VCInstallDir)lib\AMD64;
$(VCInstallDir)atlmfc\lib\amd64;
$(WindowsSdkDir)lib\x64;
Свойства->configurationManager->ActiveSolutionPlatform. Здесь выберите x64. Вот и все.
Он должен позаботиться обо всех зависимостях, и компиляция должна работать гладко.
Эта проблема также может возникнуть, если ваш проект настроен на использование одинаковых промежуточных каталогов в Свойства проекта -> Свойства конфигурации -> Общие
Какая ОС? если это Windows x64, то вам нужно убедиться, что CUDA x64 была установлена и, следовательно, VS2008 должен скомпилировать проект в режиме x64...
CUDA будет устанавливать только x64 или x86 в Windows
Это происходит со мной, когда я конвертирую свое решение VS2008 в VS2010 и меняю конфигурацию win32 на X64, в моем старом решении у меня есть mfcs90d.lib (Configuration->Linker->Input-> Дополнительные зависимости), так как я использую VS010, я только что проверил в папке VS2010, где это mfcs100d.lib, поэтому я изменил mfcs90d.lib на mfcs100d.lib в (Configuration-> Linker-> Input-> Дополнительные зависимости), он работал нормально.
Я исправил для себя эту проблему следующим образом.
Прежде всего, я последовал другим ответам на этот вопрос только для того, чтобы сделать вывод, что все настройки проекта верны.
Затем я проверил файл.vcxproj с помощью редактора и заметил, что свойства для двух конфигураций (Debug и Release) x64 не указывали
Однако я уже убедился, глядя из Visual Studio в Свойства> Свойства конфигурации> Компоновщик> Дополнительно> Целевая машина, что в конфигурациях x64 указано MachineX64 (/MACHINE:X64).
Итак, я отредактировал файл.vcxproj, чтобы включить
Я восстановил, и это сработало.
Иногда требуется просто перекомпилировать / перекомпилировать решение / проект.
Для некоторых, использующих командную строку (подсказка dos), это может быть полезно:
call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" --help
Error in script usage. The correct usage is:
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" [option]
or
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" [option] store
or
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" [option] [version number]
or
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" [option] store [version number]
where [option] is: x86 | amd64 | arm | x86_amd64 | x86_arm | amd64_x86 | amd64_arm
where [version number] is either the full Windows 10 SDK version number or "8.1" to use the windows 8.1 SDK
:
The store parameter sets environment variables to support
store (rather than desktop) development.
:
For example:
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86_amd64
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86_arm store
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86_amd64 10.0.10240.0
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86_arm store 10.0.10240.0
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x64 8.1
"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x64 store 8.1
:
Please make sure either Visual Studio or C++ Build SKU is installed.
Также, если вам это нравится:
CL "%1%2%3" /EHsc /link user32.lib Gdi32.lib Winmm.lib comctl32.lib *.obj /SUBSYSTEM:CONSOLE /MACHINE:x86
вы должны удалить *.obj раньше; чтобы избежать путаницы компоновщика с 64- и 32-разрядными объектами, оставшимися от предыдущих компиляций?
Выше много хороших предложений.
Также, если вы пытаетесь собрать x86 Win32:
Убедитесь, что любые библиотеки, на которые вы ссылаетесь в Program Files(x86), на самом деле являются библиотеками x86, потому что они не обязательно...
Например, файл lib, с которым я связался в C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\SDK, вызвал эту ошибку, в конце концов я нашел его версию x86 в C:\Program Files (x86)\Windows Kits\10\Lib\10.0.18362.0\um\x86 и все работало нормально.
Тип компьютера модуля - это компьютер, на котором вы компилируете, а тип компьютера назначения - это архитектура x86 или x64, для которой вы создаете свои двоичные файлы.
Для тех, кто использует QT Creator, проблема такая же (как описано @c-johnson). Убедитесь, что в настройках компилятора для MSVC в вашем наборе установлено значение x86, как показано ниже.