фатальна помилка LNK1112: тип машини «x64» модуля конфліктує з цільовим типом машини «X86»


187

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

Я намагався перетворити платформу на x64, але це не вийшло. Скажіть, будь ласка: що таке "тип модульної машини" та що таке "цільовий тип машини"? Як я можу це подолати?

Відповіді:


262

Про це я написав запис у блозі , коли зіткнувся з цією божевільною проблемою, і нарешті повернув свою систему до робочого стану.

Це необхідно перевірити в такому порядку:

  1. Перевірте параметри властивостей у налаштуваннях вашого лінкера за адресою: Властивості> Властивості конфігурації> Linker> Advanced> Target Machine. Виберіть MachineX64, якщо ви орієнтуєтесь на 64-бітну збірку, або MachineX86, якщо ви створюєте 32-бітну збірку.

  2. Виберіть Збірка> Менеджер конфігурацій у головному меню візуальної студії. Переконайтеся, що у вашому проекті вказана правильна платформа. Можна встановити IDE для складання x64, але індивідуальний проект у рішенні може бути встановлений на цільовий win32. Так так, візуальна студія залишає багато мотузки, щоб повісити себе, але це життя.

  3. Перевірте файли бібліотеки, на які вони дійсно є типом платформи. Це можна використовувати, використовуючи dumpbin.exe, який знаходиться у вашому візуальному каталозі VC \ bin. використовуйте параметр -headers, щоб скинути всі свої функції. Шукайте машинний запис для кожної функції. він повинен включати x64, якщо це 64-бітна збірка.

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

Як тільки я зробив крок 4, для мене все знову працювало. Річ у тім, що я стикався з цією проблемою у всіх своїх проектах, де хотів скласти ціль до 64-бітної цілі.


6
Рятувальник життя. Також на кроці 4 "Бібліотечні каталоги" також потребують оновлення до 64-бітових контурів
Григорій

37
Для тих, хто використовує Visual Studio 2013 - крок 4 застарілий, тепер ви внесете зміни у властивості проекту -> властивості конфігурації -> Каталоги VC ++ - Каталоги бібліотек
PolyMesh

3
Якщо ви використовуєте зовнішню бібліотеку, яка була складена як x86, ви також отримаєте цю помилку. Я наткнувся на нього, намагаючись створити проект за допомогою тестів Google.
kayleeFrye_onDeck

3
Якщо у мене немає файлу проекту (запуск nmake на Makefile), як зробити те саме?
користувач118967

3
Як це можна зробити в командному рядку замість створення проекту у версії GUI?
репзеро

152

На додаток до списку C Джонсона я додам наступний пункт:

Перевірте в Visual Studio:
Властивості проекту -> Властивості конфігурації -> Linker -> Командний рядок.

"Додаткові параметри" НЕ повинні містити /machine:X86

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


20
Це була саме моя проблема! Але це був проект, створений програмою Visual Studio 2017, створений CMake, де я використовував Менеджер конфігурацій для створення конфігурацій побудови платформи x64 (куди були скопійовані конфігурації збірки Win32 для створення конфігурацій збірки x64). Що відбувається - налаштування "/ МАШИНИ:" Linker між "Усі параметри-> Додаткові параметри" та "Додатково-> Цільова машина" конфліктом. Щоб виправити, просто видаліть налаштування "Усі параметри-> Додаткові параметри" -> "/ МАШИНА:".
BoiseBaked

2
Це, певно, врятувало мені години. Дякую!
rsp1984

3
Це було виправленням для мене, тому я просто хотів сказати спасибі, дивно, я вже проголосував, тому я, мабуть, був тут раніше з тим же питанням! :)
Адам Демпсей

1
Незначний варіант цього рішення: Деякі проекти в моєму рішенні не мають "Linker" у конфігураційних властивостях. Натомість у них "Бібліотекар". У цих випадках справді Бібліотекар -> Усі параметри -> Додаткові параметри сказав / машина: x86, тоді як Бібліотекар -> Усі параметри -> Цільова машина сказала / машина: x64. Я видалив x86 з Бібліотекаря -> Усі параметри -> Додаткові параметри ... і речі, нарешті, створені та пов'язані.
Ксеніаль

Дякую за ці поради. Здається, це поширена проблема для користувачів CMake. Голосування вгору.
Hao Xi

54

Таку ж проблему я відчував у VS2008, коли я намагався додати збірку X64 до проекту, перетвореного з VS2003.

Я переглянув усе, що було знайдено під час пошуку цієї помилки в Google (Target machine, VC ++ Directories, DUMPBIN ....), і все виглядало нормально.

Нарешті я створив новий тестовий проект і зробив ті самі зміни, і, здавалося, це спрацювало.

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

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

Якщо вилучити це та встановити його належним чином у Linker-> Advanced-> Target Machine, проблема зникла.


8
Це було саме моєю проблемою - але це походить від рішення Visual Studio, створеного за допомогою CMake. Схоже, CMake також любить додавати цю опцію.
Нік Чадвік

4
Я прийшов із проекту CMake і можу підтвердити, що додав цю опцію.
BeeOnRope

25

Усі налаштування проекту здалися ідеальними, але я все-таки отримав помилку. Переглядаючи .vcxprojфайл та шукаючи "x86", виявлено проблему:

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

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


3
Також у Властивості проекту -> Параметри конфігурації -> Бібліотекар -> Усі параметри -> Додаткові параметри.
Ксеніаль

13

Оскільки проблема пов'язана з різницею в специфікаціях компіляції та цільових машин (x86 та x64), виконайте наведені нижче дії.

  1. Відкрийте проект C ++, який потрібно налаштувати.
  2. Виберіть кнопку Configuration Manager, щоб відкрити діалогове вікно Configuration Manager.
  3. У спадному списку Платформа активного рішення виберіть параметр, щоб відкрити діалогове вікно Нова платформа рішення.
  4. У спадному списку Тип або виберіть нову платформу виберіть 64-бітну платформу.

Це вирішило мою проблему.


12

Напевно, у вас є один файл .OBJ або .LIB, орієнтований на x64 (це тип модульної машини), коли ви посилаєтесь на x86 (це тип цільової машини).

Використовуйте DUMPBIN / HEADERS у своїх .OBJ-файлах і перевірте, чи є машинний запис у блоці FILE HEADER VALUES.


3
Це було першопричиною для мене, коли я стикався з цим повідомленням про помилку. Я раніше будував для однієї архітектури і не був належним чином очищений від об'єктних файлів та файлів з попередньої збірки. Після видалення всіх старих файлів .obj та .lib з попередньої збірки я зміг скласти свій проект з новою архітектурою.
Бен

Це було моєю проблемою, і рішенням було очищення перед будівлею при зміні цільових архітектур.

7

У Visual Studio 2012 +/- на сторінці властивостей "Конфігураційні властивості". Лінкер. "Командний рядок" міститься поле з написом "Додаткові параметри". Якщо ви будуєте x64, переконайтеся, що поле не містить / MACHINE: I386. Мої проекти зробили, і це породило помилку.


4

Я зіткнувся з цією проблемою під час створення QT. Інструкції, які я десь прочитав, запропонували мені налаштувати nmake за допомогою командного рядка VS.

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

Я думаю, що деякі компоненти були попередньо побудовані для 32-розрядних. Про помилку навіть повідомили, які модулі побудовані для x86.

Я використав 32-бітний командний рядок VS і він працював.


4
Це поставило мене на правильний шлях. Якщо ви будуєте 64-бітну версію, ви можете скористатися цим ярликом Windows для налаштування свого середовища: C: \ Windows \ System32 \ cmd.exe / A / Q /KC:\Qt\Qt5.1.1\5.1.1\msvc2012_64 \ bin \ qtenv2.bat & "C: \ програмні файли (x86) \ Microsoft Visual Studio 11.0 \ VC \ vcvarsall.bat" x86_amd64 & cd c: \ yourDir Важливою частиною цього є x86_amd64 - без того, що середовище не встановлено як 32-бітове середовище, і qmake вибирає його як таке.
gremwell

3

У Visual Studio 2013,

1) Перевірте сторінки сторінок властивостей проекту / Властивості конфігурації / Linker / Усі параметри та виправте всі пропущені машини та каталоги.

2) Перевірте сторінки сторінок властивостей проекту / Властивості конфігурації / Linker / Input та виправте всі пропущені каталоги.

Дивіться приклад 1)


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

Якщо у вашому рішенні є ліб-проекти, перевірте властивість цільової машини у Властивості-> Бібліотекар-> Загальне


1

Окрім списку Джонсона, також перевірте папки бібліотеки

У візуальній студії виберіть Інструменти> Параметри у головному меню. виберіть Проекти та рішення> Каталоги VC ++. Виберіть x64 зі спадного меню Платформа.

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

1

Це сталося зі мною сьогодні, тому що я додав каталог бібліотеки, перебуваючи в режимі x86, і випадково видалив успадковані каталоги, зробивши їх замість них жорсткими. Потім після переходу на x64 мої каталоги VC ++ все ще читають:

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

замість _x64.


Дякую. Це була моя проблема. Для майбутніх читачів тепер мій "Бібліотечний довідники" читає$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64;
Phlox Midas

1

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


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

1

Це дуже засмучує і дратує проблему, але як тільки ви це зрозумієте, це досить просто: у вас є якийсь елемент, який ви будуєте, будуючи такий тип архітектури (у вашому випадку x64), незважаючи на те, що він був націленим на інший тип (скажімо, x86 ).

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

Я би заглянув туди першим, перш ніж переглядати список справ Дж. Джонсона.



0

Тип модульної машини - це машина, на якій ви компілюєте, а типовим типом машини є архітектура x86 або x64, для якої ви будуєте свої бінарні файли.


0

Ця проблема також може статися, якщо ваш проект налаштований на однакові проміжні каталоги у Властивості проекту -> Властивості конфігурації -> Загальне


0

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

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


0

це трапляється зі мною, коли я перетворюю рішення VS2008 у VS2010 і змінюю конфігурацію win32 на X64, у моєму старому рішенні я маю mfcs90d.lib (Конфігурація-> Linker-> Введення-> Додаткові залежності), оскільки я використовую VS010, щойно перевірив у папці VS2010, де це mfcs100d.lib, тому я змінив mfcs90d.lib на mfcs100d.lib в (Конфігурація-> Linker-> Введення-> Додаткові залежності), він працював чудово.


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 : CONSOLE / MACHINE: x86

ви повинні дель * .obj раніше ; щоб не плутати лінкер як з 64, так і з 32-бітовими об'єктами, що залишилися від попередніх компіляцій?


0

Багато хороших пропозицій вище.

Також якщо ви намагаєтеся побудувати в x86 Win32:

Переконайтеся, що будь-які бібліотеки, на які ви посилаєтесь у файлах програми (x86), насправді є бібліотеками x86, оскільки вони не обов'язково ...

Наприклад, файл lib, з яким я пов’язаний у C: \ Program Files (x86) \ Microsoft Visual Studio \ 2019 \ Professional \ SDK, викинув цю помилку, врешті я знайшов її версію x86 у C: \ Program Files (x86) \ Windows Набори \ 10 \ Lib \ 10.0.18362.0 \ um \ x86 і все спрацювало нормально.


-1

що таке ОС? якщо це Windows x64, то вам потрібно переконатися, що CUDA x64 був встановлений, і таким чином VS2008 повинен компілювати проект у режимі x64 ...

CUDA встановлюватиме лише x64 АБО x86 у Windows


Це здається помилкою під час створення та спроби зв’язку. В основному це невідповідність або непослідовність у налаштуваннях збірки; цільова платформа, яку можна вказати як параметр для різних етапів збирання, не є послідовною.
Шаммі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.