致命的なエラーLNK1112:モジュールマシンタイプ 'x64'がターゲットマシンタイプ 'X86'と競合しています


187

私はCUDA(VC ++、Visual studio 2008sp1)を使用してFEMプログラムをデバッグしています。このプログラムはcudaが不十分なため、Win32プラットフォームでのみ実行できます。リンクされているライブラリファイルはすべてx86プラットフォームでコンパイルされていると思いますが、コンパイルすると、「致命的なエラーLNK1112:モジュールマシンタイプ 'x64'がターゲットマシンタイプ 'X86'と競合しています」というエラーメッセージが表示されます。

プラットフォームをx64に変換しようとしましたが、機能しませんでした。「モジュールマシンタイプ」とは何ですか、「ターゲットマシンタイプ」とは何ですか?どうすれば克服できますか?

回答:


261

私はこの厄介な問題に遭遇したので、これについてブログエントリを書き、最終的にシステムを正常な状態に戻しました。

これらはこの順序でチェックするものです:

  1. プロパティ>構成プロパティ>リンカー>詳細設定>ターゲットマシンのリンカー設定でプロパティオプションを確認します。64ビットビルドを対象とする場合はMachineX64を選択し、32ビットビルドを対象とする場合はMachineX86を選択します。

  2. Visual Studioのメインメニューから[ビルド]> [構成マネージャー]を選択します。プロジェクトに正しいプラットフォームが指定されていることを確認してください。IDEがx64をビルドするように設定することは可能ですが、ソリューション内の個々のプロジェクトをwin32をターゲットに設定することができます。そう、そうです、ビジュアルスタジオは自分自身を吊るすために多くのロープを残していますが、それは人生です。

  3. ライブラリファイルが本当にターゲットにしているプラ​​ットフォームのタイプであることを確認してください。これは、Visual StudioのVC \ binディレクトリにあるdumpbin.exeを使用して使用できます。-headersオプションを使用して、すべての関数をダンプします。各機能のマシンエントリを探します。64ビットビルドの場合は、x64を含める必要があります。

  4. Visual Studioで、メインメニューから[ツール]> [オプション]を選択します。[プロジェクトとソリューション]> [VC ++ディレクトリ]を選択します。[プラットフォーム]ドロップダウンから[x64]を選択します。最初のエントリが$(VCInstallDir)\ bin \ x86_amd64の後に$(VCInstallDir)\ binが続くことを確認します。

ステップ4を実行すると、すべてが再び機能しました。問題は、64ビットターゲットに向けてコンパイルしたいすべてのプロジェクトでこの問題に直面していたことです。


6
ライフセーバー。また、手順4では、「ライブラリディレクトリ」も64
Gregory

37
Visual Studio 2013を使用している場合-ステップ4は非推奨になりました。プロジェクトプロパティ->構成プロパティ-> VC ++ディレクトリ-ライブラリディレクトリ
PolyMesh

3
x86としてコンパイルされた外部ライブラリを使用している場合も、このエラーが発生します。Google Test libsを使用してプロジェクトをビルドしようとしたときに、私はそれに遭遇しました。
kayleeFrye_onDeck 2016

3
(Makefileでnmakeを実行している)プロジェクトファイルがない場合、どうすれば同じことができますか?
user118967

3
GUIバージョンでプロジェクトを作成する代わりに、コマンドラインでこれを行うにはどうすればよいですか?
repzero 16

152

加えて、C・ジョンソンのリスト私は、次の点を追加します。

Visual Studioで確認し
ます。プロジェクトのプロパティ->構成のプロパティ->リンカ->コマンドライン。

「追加オプション」は含まれていません /machine:X86

CMakeの出力によって生成されたそのようなキーがあります。CMakeがx86プロジェクトを生成しConfiguration Manager、Visual Studio 2010 を介してx64プラットフォームを追加しました。リンカーのコマンドラインを/machine:X86別に指定することを除いて、すべて新しいプラットフォーム用に問題なく作成されました。


20
これはまさに私の問題でした!しかし、それはCMakeで生成されたVisual Studio 2017プロジェクトで、構成マネージャーを使用してx64プラットフォームのビルド構成を作成しました(Win32ビルド構成をコピーしてx64ビルド構成を作成しました)。リンカの「/ MACHINE:」設定が「すべてのオプション->追加オプション」と「詳細->ターゲットマシン」の間で競合していることが起こります。修正するには、 "All Options-> Additional Options"-> "/ MACHINE:"設定を削除するだけです。
BoiseBaked 2017年

2
これでおそらく時間を節約できました。ありがとう!
rsp1984

3
これは私にとっての修正だったので、ただお礼を言いたかったのですが、奇妙なことに私はすでに賛成していたので、同じ問題で以前ここにいたはずです!:)
アダムデンプシー

1
このソリューションのわずかなバリエーション:私のソリューションの一部のプロジェクトには、構成プロパティに「リンカー」がありません。代わりに彼らは「司書」を持っています。それらの場合、実際には、ライブラリアン->すべてのオプション->追加オプションは/ machine:x86と言い、ライブラリアン->すべてのオプション->ターゲットマシンは/ machine:x64と言った。Librarian-> All Options-> Additional Options ...からx86を削除し、最終的にビルドしてリンクしました。
-Xenial、

これらのヒントをありがとう。これはCMakeユーザーにとって一般的な問題のようです。賛成票。
Hao Xi

54

VS2003から変換されたプロジェクトにX64ビルドを追加しようとしたときに、VS2008でも同じ問題が発生しました。

Googleでこのエラーを検索したときに見つかったすべて(ターゲットマシン、VC ++ Directories、DUMPBIN ...)を調べたところ、すべて問題ありませんでした。

最後に、新しいテストプロジェクトを作成し、同じ変更を加えましたが、うまくいったようです。

vcprojファイル間でdiffを実行すると、問題が明らかになりました...

変換されたプロジェクトでは、リンカー->コマンドラインで追加のオプションセットとして/ MACHINE:i386が設定されていました。したがって、2つの/ MACHINEオプションセット(x64とi386の両方)があり、追加のオプションが優先されました。

これを削除し、リンカー->詳細設定->ターゲットマシンで適切に設定すると、問題が解消されました。


8
これもまさしく私の問題でした-しかし、これはCMakeを使用して作成されたVisual Studioソリューションが原因でした。CMakeもこのオプションを追加したいようです。
Nick Chadwick

4
私はCMakeプロジェクトから来ましたが、このオプションが追加されたことを確認できます。
BeeOnRope

25

すべてのプロジェクト設定は完璧に見えましたが、それでもエラーが発生しました。みると.vcxproj、ファイルとの「x86」を検索すると、問題を明らかにしました。

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

すべての発生(10個の個別のファイル設定)のクイック検索/置換で問題が修正されました。


3
また、プロジェクトのプロパティ->設定オプション->ライブラリアン->すべてのオプション->追加オプションにもあります。
-Xenial、

13

問題の原因は、コンパイルとターゲットマシンの仕様(x86およびx64)の違いにあるため、次の手順に従ってください。

  1. 構成するC ++プロジェクトを開きます。
  2. [構成マネージャー]ボタンを選択して、[構成マネージャー]ダイアログボックスを開きます。
  3. [アクティブソリューションプラットフォーム]ドロップダウンリストで、[新しいソリューションプラットフォーム]ダイアログボックスを開くオプションを選択します。
  4. [タイプ]または[新しいプラットフォームを選択]ドロップダウンリストで、64ビットプラットフォームを選択します。

それは私の問題を解決しました。


12

x86(ターゲットマシンタイプ)にリンクしているときに、x64(モジュールマシンタイプ)をターゲットとする.OBJファイルまたは.LIBファイルが1つある可能性があります。

.OBJファイルでDUMPBIN / HEADERSを使用し、FILE HEADER VALUESブロックでマシンエントリを確認します。


3
これは、このエラーメッセージが表示されたときの根本的な原因でした。私は以前に1つのアーキテクチャ用にビルドしており、その以前のビルドからオブジェクトファイルとライブラリを適切にクリーンアップしていませんでした。以前のビルドから古い.objおよび.libファイルをすべて削除した後、新しいアーキテクチャでプロジェクトをコンパイルすることができました。
ベン

これは私の問題であり、解決策は、ターゲットアーキテクチャを変更するときにビルド前にクリーンアップすることでした。

7

Visual Studio 2012 +/-では、 "Configuration Properties'.Linker。" Command Line "のプロパティページに" Additional Options "というラベルの付いたボックスが含まれています。x64をビルドしている場合は、そのボックスに/ MACHINEが含まれていないことを確認してください。 I386。プロジェクトで問題が発生し、エラーが発生しました。


4

QTをビルドするときにこの問題に遭遇しました。私がどこかで読んだ指示は、VSコマンドプロンプトを使用してnmakeを構成することを示唆しています。

私は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:\ Program Files(x86)\ Microsoft Visual Studio 11.0 \ VC \ vcvarsall.bat" x86_amd64&cd c:\ YourDirこれに関する重要な部分はx86_amd64です-環境が設定されていない場合32ビット環境として起動し、qmakeはそれをピックアップします。
gremwell 2013年

3

Visual Studio 2013では、

1)プロジェクトのプロパティページ/構成プロパティ/リンカー/すべてのオプションをチェックインし、構成されていないすべてのマシンとディレクトリを修正します。

2)プロジェクトプロパティページ/構成プロパティ/リンカー/入力をチェックインして、構成ミスのあるディレクトリをすべて修正します。

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

ソリューションにlibプロジェクトがある場合は、[プロパティ]-> [ライブラリアン]-> [一般]で[ターゲットマシン]プロパティを確認します


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の代わりに。


ありがとう。それが私の問題でした。将来の読者のために、私の「ライブラリディレクトリ」は今読みます$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);$(NETFXKitsDir)Lib\um\x64;
Phlox Midas '26

1

CMakeを使用していて、次にwin32構成を追加しました。プロパティページにはx86が表示されていましたが、実際には、vcxprojファイルをテキストエディターで開いたときにx64でした。これを手動でx86に変更すると解決しました。


2
私は似たようなものを持っていました。どこにどの設定が隠されていたのかわかりません(そして、ここでほとんどの回答のアドバイスに従いました)が、ジェネレーターを指定すると、それに応じてcmakeが実行されました。-G "Visual Studio 12 Win 64"。
user55937 2017年

1

これは非常にイライラする煩わしい問題ですが、一度理解すれば、それは非常に簡単です。あるタイプのアーキテクチャ(あなたの場合はx64)を構築するときに、別のタイプ(x86など)のターゲットであるにもかかわらず、いくつかの要素があります)。

クラッシュの原因となっているobjファイルを確認することで問題の原因を分析し、そこで問題の検索を開始できます。すべてのobjには、cpp、c、asmなどのソースコードアナログがあります。その周りに、間違ったツールを使用している特別なビルドイベントがある可能性があります。プロパティシートで確認してください。

Cジョンソンのやることリストを見る前に、まずそこを見てみます。



0

モジュールマシンタイプはコンパイルするマシンであり、ターゲットマシンタイプはバイナリを構築するアーキテクチャx86またはx64です。


0

この問題は、プロジェクトが[プロジェクトプロパティ]-> [構成プロパティ]-> [一般]で同じ中間ディレクトリを持つように設定されている場合にも発生する可能性があります。


0

まず、次のことを試してください。1.構成マネージャーに移動し、まだ存在しない場合は新しいx64を作成します。2. x64ソリューションを選択します。3.プロジェクトのプロパティに移動し、[リンカー]-> [詳細設定]でx64マシンを選択します。4.次に、ソリューションを再構築します。

それでも同じエラーが発生する場合。クリーンソリューションを試してから、再ビルドしてVisual Studioを開きます。最近開いたプロジェクトのリストが表示されます。プロジェクトを右クリックして、そこから削除します。次に、ソリューションに移動し、ソリューションを再度開きます。


0

これは、VS2008ソリューションをVS2010に変換し、win32構成をX64に変更すると発生します。以前のソリューションでは、VS010を使用しているため、mfcs90d.lib(構成->リンカー->入力->追加の依存関係)を持っているため、それはmfcs100d.libであるVS2010フォルダー内にあるので、(構成->リンカー->入力->追加の依存関係)でmfcs90d.libをmfcs100d.libに変更しました。



0

一部のコマンドプロンプト(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ビットの両方のオブジェクトとリンカーを混同しないようにするには?


0

上記の多くの良い提案。

また、x86 Win32でビルドしようとしている場合:

Program Files(x86)でリンクするライブラリは、必ずしもx86ライブラリではないことを確認してください。

たとえば、C:\ Program Files(x86)\ Microsoft Visual Studio \ 2019 \ Professional \ SDKでリンクしたlibファイルがそのエラーをスローし、最終的にC:\ Program Files(x86)\ Windowsでそのx86バージョンが見つかりましたKits \ 10 \ Lib \ 10.0.18362.0 \ um \ x86およびすべてが正常に動作しました。


-1

OSとは?それがWindows x64の場合、CUDA x64がインストールされていること、したがってVS2008がx64モードでプロジェクトをコンパイルすることを確認する必要があります...

CUDAはWindowsにx64またはx86のみをインストールします


これは、ビルドしてリンクしようとするとエラーになるようです。基本的には、ビルド設定の不一致または不整合です。さまざまなビルドステップのパラメーターとして指定できるターゲットプラットフォームに一貫性がありません。
Shammi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.