web-dev-qa-db-ja.com

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

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

プラットフォームをx64に変換しようとしましたが、うまくいきませんでした。教えてください。「モジュールマシンタイプ」と「ターゲットマシンタイプ」とは何ですか。どうやってそれを克服することができますか?

161
user430382

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

これらはこの順序で、チェックするべき事柄です:

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

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

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

  4. ビジュアルスタジオで、メインメニューから「ツール」>「オプション」を選択します。 [プロジェクトとソリューション]> [VC++ディレクトリ]を選択します。プラットフォームドロップダウンからx64を選択します。最初のエントリが$(VCInstallDir)\ bin\x86_AMD64に続けて$(VCInstallDir)\であることを確認してください。 bin.

ステップ4を実行したら、すべてが私のために再び働いた。問題は、64ビットターゲットに向けてコンパイルしたいすべてのプロジェクトでこの問題が発生していたことです。

228
C Johnson

C Johnsonリストに加えて、次の点を追加します。

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

「追加オプション」には/machine:X86を含めないでください

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

128
sergtk

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

Googleでこのエラーを検索したときに見つかったものすべて(ターゲットマシン、VC++ディレクトリ、DUMPBINなど)を調べたところ、すべて問題ないようでした。

最後に私は新しいテストプロジェクトを作成し、同じ変更をしました、そしてそれはうまくいったようです。

Vcprojファイル間の差分をとることは問題を明らかにしました....

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

これを削除して、[リンカ] - > [詳細] - > [ターゲットマシン]で正しく設定すると、問題は解決しました。

53
Zid

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

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

すべての発生(10個の個別のファイル設定)を素早く検索/置換することで問題を解決しました。

22
lama12345

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

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

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

13
hab

あなたはたぶんあなたがx86のためにリンクしている間(それはターゲットマシンタイプです)、x64(それはモジュールマシンタイプです)をターゲットにした1つの.OBJまたは.LIBファイルを持っています。

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

12
Patrick

Visual Studio 2012 +/-では、 "Configuration Properties'.Linker。"コマンドラインのプロパティページに "Additional Options"というラベルの付いたボックスが含まれています。 I386私のプロジェクトでは問題があり、エラーが発生しました。

6
laloumen

私はQTを構築するときにこの問題に遭遇しました。私がどこかで読んだ指示は私がVSコマンドプロンプトを使用してnmakeを設定することを提案しました。

私はx64コマンドプロンプトを選び、面倒なことなくconfigureを実行しました。私はnmakeを試したとき、それはこのエラーを与えた。

一部のコンポーネントは32ビット用に事前に構築されていると思います。このエラーは、どのモジュールがx86用にビルドされたかについても報告しました。

私は32ビットのデフォルトのVSコマンドPromptを使用しました、そしてそれは働きました。

4
pvairam

Visual Studio 2013では、

1)[プロジェクトのプロパティページ]、[構成プロパティ]、[リンカ]、[すべてのオプション]の順にチェックインし、設定が誤っているすべてのマシンとディレクトリを修正します。

2)[プロジェクトのプロパティページ]、[構成プロパティ]、[リンカ]、[入力]の順にチェックインし、設定が間違っているディレクトリをすべて修正します。

1)の例を参照 

3
fabceolin

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

1
grunt

vcxprojファイルに 'MACHINE:i386'が含まれている可能性がありますvcxprojファイルをエディタで編集します。それを除く !

1
Mark Yang

Visual Studio 2013でWin32を* 64に変更することで、この問題を解決しました。

1
Salman Saleh
"project property - CUDA Runtime API - GPU - NVCC Compilation Type"

64ビットのコンパイルオプション-m64 -cubinを設定します。

ヒントはコンパイルログです。このような:

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

その"-machine 32"が問題です。

最初に64ビットコンパイルオプションを設定し、次にハイブリッドコンパイルオプションを再設定します。それからあなたは成功を見ることができます。

1
chang

これは、私がまだx86モードの間にライブラリディレクトリを追加し、継承されたディレクトリを誤って削除して代わりにハードコードされていたために、今日私に起こりました。それからx64に切り替えた後、私のVC++ディレクトリはまだ読んでいます:

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

_x64の代わりに。

1
masterxilo

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

1
Rinat

それは非常にイライラさせて厄介な問題ですが、一度それを理解すれば、それは非常に簡単です:あなたがそれを別のタイプのターゲットにしたという事実にもかかわらず、あなた).

どのobjファイルがクラッシュの原因となっているのかを調べることで問題の原因を突き止め、そこで問題を探し始めることができます。すべてのobjは、cpp、c、asmなどの類似のソースコードを持っています。その周りには、間違ったツールを使っている特別なビルドイベントがあるかもしれません。プロパティシートでそれを確認してください。

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

1
user7484190

Jhonsonさんのリストに加えて、図書館のフォルダもチェックしてください

ビジュアルスタジオで、メインメニューから「ツール」>「オプション」を選択します。 [プロジェクトとソリューション]> [VC++ディレクトリ]を選択します。プラットフォームドロップダウンからx64を選択します。

$(VCInstallDir)lib\AMD64;
$(VCInstallDir)atlmfc\lib\AMD64;
$(WindowsSdkDir)lib\x64;
1
Igor Barbarian

module machine typeはコンパイルしているマシンであり、target machine typeはバイナリをビルドしているアーキテクチャx86またはx64です。

0
djs

コマンドプロンプトを使用する(プロンプトを実行する)場合、これが役立つ場合があります。

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 * .objbefore;リンカが以前のコンパイルで残った64ビットと32ビットの両方のオブジェクトと混同されないようにするには?

0
kris2k

QT Creatorを使用している人にとって、問題は同じです(@ c-johnsonによる説明)。以下に示すように、キットのMSVCのコンパイラ設定がx86に設定されていることを確認してください。

QT Creator Kit Settings for MSVC x86 compiler

まずはじめに、以下のことを試してください。1. Configuration Managerに進み、新しいx64がまだない場合は作成します。 2. x 64ソリューションを選択します。 3.プロジェクトのプロパティに移動し、[リンカ] - > [詳細]を選択してx64マシンを選択します。 4.今すぐソリューションを再構築します。

それでもまだ同じエラーが出ます。きれいな解決策を試してから再構築してビジュアルスタジオを開くと、最近開いたプロジェクトのリストが表示されます。プロジェクトを右クリックしてそこから削除します。今すぐ解決策に行き、再度解決策を開きます。

0

私はVS010を使用しているように私がちょうど私がチェックしたように私は私のVS2008ソリューションをVS2010に変換し、私の古いソリューションで私はmfcs90d.lib(設定 - >リンカ - >入力 - >追加の依存関係)を持っているそれがmfcs100d.libであるVS2010フォルダで、私はそれがうまく働いた(設定 - >リンカ - >入力 - >追加の依存関係)でmfcs90d.libをmfcs100d.libに変えました。

0
NDestiny

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

0
Anton K