фатальная ошибка LNK1112: тип компьютера модуля «x64» конфликтует с типом машины назначения «X86»

187

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

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

user430382
источник

Ответы:

262

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

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

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

С Джонсон
источник
6
Спасатель жизни. Также на шаге 4 «Библиотечные каталоги» также должны быть обновлены до 64-битных путей
Грегори
37
Для тех, кто использует Visual Studio 2013 - шаг 4 устарел, теперь вы вносите изменения в свойства проекта -> свойства конфигурации -> Каталоги VC ++ - Каталоги библиотек
PolyMesh
3
Если вы используете внешнюю библиотеку, скомпилированную как x86, вы также получите эту ошибку. Я столкнулся с ним, когда пытался создать проект с использованием библиотек Google Test.
kayleeFrye_onDeck
3
Если у меня нет файла проекта (запускающего nmake на Makefile), как мне сделать то же самое?
user118967
3
Как вы можете сделать это в командной строке вместо создания проекта в версии с графическим интерфейсом?
repzero
152

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

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

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

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

sergtk
источник
20
Это была именно моя проблема! Но это был проект Visual Studio 2017, созданный CMake, в котором я использовал Configuration Manager для создания конфигураций сборки платформы x64 (где конфигурации сборки Win32 были скопированы для создания конфигураций сборки x64). Что происходит, так это то, что настройки компоновщика "/ MACHINE:" между "Все параметры-> Дополнительные параметры" и "Дополнительно-> Целевая машина" конфликтуют. Чтобы исправить это, просто удалите параметр «Все параметры-> Дополнительные параметры» -> «/ МАШИНА:».
BoiseBaked
2
Это, вероятно, сэкономило мне часы. Спасибо!
rsp1984
3
Это было исправление для меня, так что просто хотел сказать спасибо, странно, я уже проголосовал, поэтому я должен был быть здесь раньше с той же проблемой! :)
Адам Демпси
1
Небольшой вариант этого решения: некоторые проекты в моем решении не имеют «компоновщика» в свойствах конфигурации. Вместо этого у них есть «Библиотекарь». В этих случаях действительно Библиотекарь -> Все параметры -> Дополнительные параметры сказал / машина: x86, в то время как Библиотекарь -> Все параметры -> Целевая машина сказал / машина: x64. Я удалил x86 из Библиотекаря -> Все параметры -> Дополнительные параметры ... и все, наконец, построено и связано.
19
Спасибо за эти советы. Кажется, это общая проблема для пользователей CMake. До голосования.
Хао Си
54

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

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

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

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

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

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

Zid
источник
8
Это тоже была моя проблема - но это произошло от решения Visual Studio, созданного с помощью CMake. Похоже, CMake тоже любит добавлять эту опцию.
Ник Чедвик
4
Я пришел из проекта CMake и могу подтвердить, что добавил эту опцию.
BeeOnRope
25

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

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

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

lama12345
источник
3
Также в Свойства проекта -> Параметры конфигурации -> Библиотекарь -> Все параметры -> Дополнительные параметры.
Ксениал
13

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

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

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

хаб
источник
12

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

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

Патрик
источник
3
Это было основной причиной для меня, когда я столкнулся с этим сообщением об ошибке. Ранее я создавал для одной архитектуры и не очищал должным образом объектные файлы и библиотеки из предыдущей сборки. После удаления всех старых файлов .obj и .lib из предыдущей сборки я смог скомпилировать свой проект с новой архитектурой.
Бен
Это была моя проблема, и решение было очистить перед сборкой при изменении целевых архитектур.
7

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

laloumen
источник
4

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

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

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

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

pvairam
источник
4
Это поставило меня на правильный путь. Если вы собираете 64-битную версию, вы можете использовать этот ярлык Windows для настройки вашей среды: C: \ Windows \ System32 \ cmd.exe / A / Q /KC:\Qt\Qt5.1.1\5.1.1\msvc2012_64 \ bin \ qtenv2.bat & "C: \ Program Files (x86) \ Microsoft Visual Studio 11.0 \ VC \ vcvarsall.bat" x86_amd64 & cd c: \ YourDir Важной частью этого является x86_amd64 - без настройки среды как 32-битная среда, и qmake подхватывает его как таковой.
Гремвелл
3

В Visual Studio 2013

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

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

Смотрите пример 1)

fabceolin
источник
2

Файл vcxproj может содержать 'MACHINE: i386' Редактировать файл vcxproj с помощью редактора. убери это !

Марк Ян
источник
1
"project property - CUDA Runtime API - GPU - NVCC Compilation Type"

Установите 64-битную опцию компиляции -m64 -cubin

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

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

Который "-machine 32" проблема.

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

чан
источник
1

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

Ринат
источник
1

В дополнение к списку Джонсон, также проверьте папки библиотеки

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

$(VCInstallDir)lib\AMD64;
$(VCInstallDir)atlmfc\lib\amd64;
$(WindowsSdkDir)lib\x64;
Игорь Варвар
источник
1

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

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

вместо _x64.

masterxilo
источник
Спасибо. Это была моя проблема. Для будущих читателей мои «Библиотечные каталоги» теперь читаются$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64;
Флокс Мидас
1

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

хрюкать
источник
2
У меня было что-то подобное. Я не знаю, где и где скрывались настройки (и я последовал совету большинства ответов здесь), но указание генератора соответственно сделало это для меня: cmake. -G "Visual Studio 12 Win 64".
user55937
1

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

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

Я бы посмотрел там сначала, прежде чем перейти к списку вещей, которые должен сделать C Johnson.


источник
1

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

Салман Салех
источник
0

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

диджеев
источник
0

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

Антон К
источник
0

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

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

Дигвиджай Раторе
источник
0

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

NDestiny
источник
0

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

Настройки QT Creator Kit для компилятора MSVC x86

Джимсон Каннантхара Джеймс
источник
0

для некоторых использующих командную строку (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-битными объектами, оставшимися от предыдущих компиляций?

kris2k
источник
0

Много хороших предложений выше.

Также, если вы пытаетесь встроить Win32 в x86:

Убедитесь, что любые библиотеки, на которые вы ссылаетесь в 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 и все работало нормально.

GrahamJ
источник
-1

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

CUDA будет устанавливать только x64 или x86 в Windows

Конор
источник
Это похоже на ошибку при сборке и попытке связать. В основном это несоответствие или несоответствие в настройках сборки; целевая платформа, которая может быть указана в качестве параметра для различных этапов сборки, не согласована.
Шамми