Фатальная ошибка LNK1112: тип модуля модуля "x64" конфликтует с типом целевой машины "X86"

Я использую CUDA (VС++, Visual studio 2008sp1) для отладки программы FEM. Программа может работать только на платформе Win32, для недостаточности cuda. Я думаю, что связанные с библиотекой файлы скомпилированы на платформе x86, но когда я ее компилирую, я получаю сообщение об ошибке "Неустранимая ошибка LNK1112: тип машинного модуля" x64 "конфликтует с типом целевой машины" X86 ".

Я попытался преобразовать платформу в x64, но это не сработало. Скажите, пожалуйста, что такое "тип модульной машины" и что такое "тип целевой машины"? Как я могу его преодолеть?

Ответ 1

Я написал запись в блоге об этом, когда столкнулся с этой сводящей с ума проблемой, и наконец вернул мою систему в рабочее состояние.

Вот что нужно проверить в следующем порядке:

  1. Проверьте параметры свойств в настройках компоновщика по адресу: Свойства> Свойства конфигурации> Компоновщик> Дополнительно> Целевой компьютер. Выберите MachineX64, если вы используете 64-битную сборку, или MachineX86, если вы делаете 32-битную сборку.

  2. Выберите Build> Configuration Manager из главного меню в Visual Studio. Убедитесь, что в вашем проекте указана правильная платформа. Возможно, для среды IDE будет установлена сборка x64, но для отдельного проекта в решении может быть задано целевое значение win32. Так что да, визуальная студия оставляет много веревки, чтобы повеситься, но эта жизнь.

  3. Проверьте файлы своей библиотеки, что они действительно относятся к тому типу платформы, на который нацелены. Это можно использовать с помощью dumpbin.exe, который находится в каталоге Visual Studio VC\bin. используйте опцию -headers для сброса всех ваших функций. Ищите запись машины для каждой функции. он должен включать x64, если это 64-битная сборка.

  4. В Visual Studio выберите Инструменты> Параметры в главном меню. выберите Проекты и решения> VC++ Каталоги. Выберите x64 из раскрывающегося списка Платформа. Убедитесь, что первая запись: $ (VCInstallDir)\bin\x86_amd64, за которой следует $ (VCInstallDir)\bin.

Как только я сделал шаг 4, все снова заработало для меня. Дело в том, что я сталкивался с этой проблемой во всех моих проектах, где я хотел скомпилировать в направлении 64-битной цели.

Ответ 2

В дополнение к списку С. Джонсона я бы добавил следующее:

Проверьте в Visual Studio:
Свойства проекта → Свойства конфигурации → Компоновщик → Командная строка.

"Дополнительные параметры" НЕ должны содержать /machine:X86

У меня есть такой ключ, сгенерированный выводом CMake: CMake сгенерировал проект x86, затем я добавил платформу x64 через Configuration Manager в Visual Studio 2010 - все было прекрасно создано для новой платформы, за исключением командной строки компоновщика, указано /machine:X86 отдельно.

Ответ 3

У меня возникла такая же проблема в VS2008, когда я попытался добавить сборку X64 в проект, преобразованный из VS2003.

Я просмотрел все, что было обнаружено при поиске этой ошибки в Google (целевой компьютер, каталоги VС++, DUMPBIN....), и все выглядело нормально.

Наконец, я создал новый тестовый проект и сделал те же изменения, и он, похоже, сработал.

Выполнение разницы между файлами vcproj показало проблему....

Мой преобразованный проект имел /MACHINE: i386 установлен как дополнительная опция, установленная в Linker- > Command Line. Таким образом, были установлены два параметра /MACHINE (как x64, так и i386), а дополнительный - предпочтение.

Удаление и правильная настройка в Linker- > Advanced- > Target Machine устранили проблему.

Ответ 4

Все настройки проекта казались идеальными, но я все еще получил ошибку. В файле .vcxproj и поиске "x86" была обнаружена проблема:

<Lib>
  <AdditionalOptions> /machine:X86 %(AdditionalOptions)</AdditionalOptions>
</Lib>

Быстрый поиск/замена для всех событий (десять отдельных параметров файла) устранил проблему.

Ответ 5

Поскольку проблема связана с различием в спецификации компиляции и целевой машины (x86 и x64) Выполните следующие шаги:

  • Откройте проект С++, который вы хотите настроить.
  • Выберите кнопку Configuration Manager, чтобы открыть диалоговое окно Configuration Manager.
  • В раскрывающемся списке "Платформа Active Solution" выберите параметр, чтобы открыть диалоговое окно "Новая платформа решений".
  • В раскрывающемся списке Тип или выберите новую платформу выберите 64-битную платформу.

Он решил мою проблему.

Ответ 6

У вас, вероятно, есть один файл .OBJ или .LIB, предназначенный для x64 (тип модуля модуля), когда вы привязываетесь к x86 (тип целевой машины).

Используйте DUMPBIN/HEADERS в ваших .OBJ файлах и проверьте наличие записи в блоке FILE HEADER VALUES.

Ответ 7

В Visual Studio 2012 +/- на странице свойств "Свойства конфигурации".Linker. "Командная строка" содержит поле с надписью "Дополнительные параметры". Если вы создаете x64, убедитесь, что в поле не содержится /MACHINE: I386. Мои проекты выполнялись, и это породило ошибку, о которой идет речь.

Ответ 8

Я столкнулся с этой проблемой при построении QT. В инструкциях, которые я читал, я предложил настроить nmake с помощью командной строки VS.

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

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

Я использовал 32-битную командную строку по умолчанию VS, и она сработала.

Ответ 9

В Visual Studio 2013,

1) Проверьте страницы свойств проекта/свойства конфигурации/компоновщик/все параметры и исправьте все пропущенные машины и каталоги.

2) Проверьте страницы свойств проекта/свойства конфигурации/компоновщик/ввод и исправьте все пропущенные настроенные каталоги.

См. пример 1) TMXKA6X.jpg

Ответ 10

"project property - CUDA Runtime API - GPU - NVCC Compilation Type"

Задайте опцию компиляции 64 бит -m64 -cubin

Подсказка в журнале компиляции. Вот так:

nvcc.exe ~~~~~~ -machine 32 -ccbin ~~~~~

Это "-machine 32" является проблемой.

Первый набор 64-битной опции компиляции, следующий параметр настройки гибридной компиляции. Тогда u может видеть успешное выполнение.

Ответ 11

Если ваше решение имеет проекты lib, проверьте свойство Target Machine в Property- > Librarian- > General

Ответ 12

В дополнение к списку Jhonson также проверяйте папки библиотек

В визуальной студии выберите "Инструменты" > "Параметры" в главном меню. выберите "Проекты и решения" > "Каталоги VС++". Выберите x64 в раскрывающемся списке "Платформа".

$(VCInstallDir)lib\AMD64;
$(VCInstallDir)atlmfc\lib\amd64;
$(WindowsSdkDir)lib\x64;

Ответ 13

Это случилось со мной сегодня, потому что я добавил каталог библиотеки в режиме x86 и случайно удалил унаследованные каталоги, сделав их жестко закодированными. Затем, перейдя на x64, мои VС++-каталоги все еще читают:

"...; $(VC_LibraryPath_x86); $(WindowsSDK_LibraryPath_x86);"

вместо _x64.

Ответ 14

Я использовал CMake, а затем добавил конфигурацию win32. На странице свойств было показано x86, но при открытии файла vcxproj в текстовом редакторе было x64! Ручное изменение на x86 решило это.

Ответ 15

Это очень неприятная и неприятная проблема, но как только вы ее понимаете, это довольно просто: у вас есть какой-то элемент в вашей сборке, который создает один тип архитектуры (в вашем случае x64), несмотря на то, что он был целью для другого типа (скажем, x86).

Вы можете проанализировать источник своей проблемы, посмотрев, какой файл obj вызывает сбои и начинает искать проблему. Каждый obj будет иметь аналог исходного кода: либо в cpp, c, asm и т.д. Вокруг него могут быть специальные события сборки, которые используют неправильный инструмент. Проверьте это в листах свойств.

Я бы посмотрел там сначала, прежде чем переходить к списку дел Джонсона.

Ответ 16

Файл vcxproj может содержать "MACHINE: i386" Отредактируйте файл vcxproj с помощью редактора. удалите его!

Ответ 17

Я решил эту проблему, изменив Win32 на * 64 в Visual Studio 2013.

Ответ 18

Тип модуля модуля - это машина, на которой вы компилируете, а тип целевой машины - это архитектура x86 или x64, для которой вы создаете свои двоичные файлы.

Ответ 19

Эта проблема также может возникнуть, если ваш проект настроен на наличие одинаковых промежуточных каталогов в свойствах проекта → Свойства конфигурации → Общие

Ответ 20

Прежде всего, попробуйте следующее: 1. goto Configuration Manager и создайте новый x64, если он еще не существует. 2. Выберите решение x64. 3. Перейдите к свойствам проекта, а затем Linker- > Advanced выберите машину x64. 4. Теперь переустановите решение.

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

Ответ 21

это происходит со мной, когда я конвертирую решение VS2008 в VS2010 и меняю конфигурацию win32 на X64, в моем старом решении у меня есть mfcs90d.lib(Configuration- > Linker- > Input- > Additional dependencies), поскольку я использую VS010 Я только что проверил в папке VS2010, где это mfcs100d.lib, поэтому я изменил mfcs90d.lib на mfcs100d.lib в (Configuration- > Linker- > Input- > Additional dependencies), он работал нормально.

Ответ 22

Для тех, кто работает с QT Creator, проблема та же (как описано в @c-johnson). Убедитесь, что настройки компилятора для MSVC в вашем наборе установлены на x86, как показано ниже.

QT Creator Kit Settings for MSVC x86 compiler

Ответ 23

для некоторых использующих командную строку (dos prompt) это может быть полезно:

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

Вы должны del *.obj до; чтобы не путать компоновщик с 64- и 32-битными объектами, оставшимися от предыдущих компиляций?

Ответ 24

что такое ОС? если это окно x64, то вам нужно убедиться, что CUDA x64 установлен и, следовательно, VS2008 должен скомпилировать проект в режиме x64...

CUDA установит только x64 OR x86 в windows