фатальная ошибка LNK1112: тип компьютера модуля «x64» конфликтует с типом машины назначения «X86» - PullRequest
163 голосов
/ 25 августа 2010

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

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

Ответы [ 23 ]

230 голосов
/ 06 декабря 2010

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

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

  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-битной цели.

126 голосов
/ 09 апреля 2013

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

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

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

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

53 голосов
/ 13 января 2012

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

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

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

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

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

Сняв его и правильно установив его в Linker-> Advanced-> Target Machine, проблема исчезла.

22 голосов
/ 13 марта 2017

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

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

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

13 голосов
/ 14 мая 2014

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

  1. Откройте проект C ++, который вы хотите настроить.
  2. Выберите кнопку Configuration Manager, чтобы открыть диалоговое окно Configuration Manager.
  3. В раскрывающемся списке Active Solution Platform выберите параметр, чтобы открыть диалоговое окно New Solution Platform.
  4. InВведите или выберите новую платформу в раскрывающемся списке, выберите 64-разрядную платформу.

Это решило мою проблему.

12 голосов
/ 25 августа 2010

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

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

6 голосов
/ 15 ноября 2014

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

4 голосов
/ 29 августа 2013

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

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

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

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

3 голосов
/ 03 января 2014

В Visual Studio 2013,

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

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

См. пример из 1)

1 голос
/ 13 января 2014

Помимо списка Джонсона, также проверьте папки библиотеки

В Visual Studio выберите Инструменты> Параметры в главном меню.выберите Проекты и решения> Каталоги VC ++.Выберите x64 из выпадающего списка Platform.

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