web-dev-qa-db-ja.com

リンクの問題:致命的なエラーLNK1112:モジュールマシンタイプ 'x64'はターゲットマシンタイプ 'X86'と競合します

WxFreeChartライブラリからサンプルアプリを実行しようとしています。リンクのコンパイル後にエラーがあります:

wxcode_msw28d_freechart.lib(wxfreechart_lib_xydataset.obj) : fatal error LNK1112: module machine type 'x64' conflicts with target machine type 'X86'

リンカーoption\advanced\target machineをMachineX64に切り替えようとしましたが、機能しません。

私はVisual Studio 2008を使用していますか?

手伝ってくれてありがとう

26
gruber

エラーは明白です。異なるCPUターゲットでコンパイルされたライブラリをリンクしようとしています。実行可能イメージには、純粋なx86(32ビット)または純粋なx64(64ビット)コードのみを含めることができます。混合はできません。

プロジェクトの新しい構成を作成してターゲットCPUを変更しますが、リンカー設定を変更するだけでは不十分です。ビルド+構成マネージャー、右上のアクティブソリューションプラットフォームコンボ、新規を選択してx64を選択します。これにより、いくつかの変更されたプロジェクト設定、最も重要なのは使用されるコンパイラを含む新しい構成が作成されます。

VS2010より前の64ビットコンパイラは、デフォルトでnotがインストールされることに注意してください。プラットフォームコンボにx64が表示されない場合は、setup.exeを再実行し、64ビットコンパイラをインストールするオプションをオンにする必要があります。次に、適用したService Packインストーラーを再実行します。

痛みの少ないアプローチとして考えられるのは、32ビットバージョンのライブラリを使用することです。

33
Hans Passant

私もこれにぶつかり、解決策を見つけました。

まず、この問題にどのように取り組んだかについて。 x86でビルドするプロジェクトがあります。次に、Configuration Managerを使用してx64を追加すると、この問題が発生しました。

BuildLog.htm注意深く、これらの両方がリンカオプションとしてリストされているのを見ました。

/MACHINE:X64  
/machine:X86 

[プロパティページ]ダイアログでこれを変更できる場所が見つからなかったため、.vcprojファイルで適切な行を探し、次のように変更しました。

AdditionalOptions=" /STACK:10000000 /machine:x64 /debug"

そして問題が解決しました。

17
l00g33k

プロジェクトプロパティ->構成プロパティ-> Librarian Set Target Machine to MachineX64(/ MACHINE:X64)に移動します

6
Joseph

私の場合、32ビットから新しい構成(64ビット)に「コピーされた設定」があり、ライブラリを更新していなかったためだと思われます。奇数。

1> MSVCRTD.lib(ti_inst.obj):致命的なエラーLNK1112:モジュールマシンタイプ「X86」がターゲットマシンタイプ「x64」と競合しています

これは、「プロパティ-> VC++ディレクトリ->ライブラリディレクトリ」が、32ビットライブラリが組み込まれているディレクトリを指していることを意味します。なんとか修正!

私の場合 http://social.msdn.Microsoft.com/Forums/ar/vcgeneral/thread/c747cd6f-32be-4159-b9d3-d2e33d2bab55

参照: http://betterlogic.com/roger/2012/02/visual-studio-2010-express-64-bit-woe

5
rogerdpack

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

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

これで私の問題が解決しました。

2
hab

X64プロパティで。\ Releaseのすべての出現を。\ x64\Releaseに変更してみてください。少なくともこれは私のために働いた...

1
Thomas

答えてくれてありがとう。私の問題は、Visual Studioのx64ソリューションをConfiguration Managerのみで32ビットに変更したことです。 32ビットとして新しいソリューションを作成し、C++コードをコピーすると、このエラーはなくなりました。 l00g33kとRogerAttrillの提案が解決策だったと思いますが、私もうまくいきました。

0
JoeC

最近、私もこの問題に遭遇しました。それは、vs _x64_でqt(_win32_)を使用したためです。 qtアプリケーション_x64_を使用する場合は、上記のようにvs _x64_-を選択できます。 _win32_を使用したいが、まだ使用していない場合は、qt(_32bit_)をダウンロードし、libディレクトリなどの環境を正しく設定する必要があります(注:多分あなたはx64(other version)で古い設定になっています。win32またはx64を別のものに変換すると、_Additional Dependencies_には古いディレクトリが含まれます!)

0
Crawl.W

これらの答えに基づいて-Librarian-> Command Line-> Additional Options(x64 Platform用)でX86リファレンスを変更する必要もありました

0
Kevin Afanasiff

これは少し古いことは知っていますが、別のヒントを提供すると思いました。私の状況では、維持しなければならないこのアプリケーションを継承しました。 VS2008プロジェクトには、C/C++-> OutputFIles-> "ObjectFIleName"および "Program Database File Name"(Win32とx64の両方のプラットフォーム用)に同じ文字列が含まれていました。したがって、Win32プラットフォームを構築したときは問題なく構築できましたが、x64を構築しようとするとエラーが発生しました。

\ Debug64\Objects\common.obj:致命的なエラーLNK1112:モジュールマシンタイプ 'X86'はターゲットマシンタイプ 'x64'と競合します

明らかに、両方のpatformsがcommon.objを同じ場所に格納していたため、x64を構築しようとしたときに、リンカーは既存のオブジェクトファイル(x86)を取得しました。

修正するには、既存の文字列をx64のマクロ「$(IntDir)\」に置き換えて(引用符なし)、残りのプロジェクトのようにマクロが正しいパスに解決されるようにしました。これで私の問題は解決しました。

0
falconK

この問題はリンカとは関係ないため、設定を変更しても結果には影響しません。これは、x86をターゲットにしようとしているが、何らかの理由でwxcode_msw28d_freechart.libがx64ファイルとしてビルドされていると想定しているために発生しています。

Wxcode_msw28d_freechart.libとその派生元のソースコードを調べてみてください。あなたの問題はそこで起こっています。間違ったツールセット(x86ではなくx64)を使用している特別なビルドステップがあるかどうかを確認します。

0
user7484190

今回はVS2012のi00gとThomasの回答の更新(一部の名前は変更されています)。構成マネージャーを使用してx86設定をx64ターゲットにコピーした後、以前と同じ理由で問題が発生します(x64構成ではlibターゲットは正しくありません)。 .vcxproj(テキストエディター)を開き、必要に応じてMachineX86をMachineX64に置き換えます。 (これがプロパティシートのどこにあるかはまだわかりません。..)これは静的ライブラリでのみ必要なようです。

0
Josh

compile -DIPLIB = NONE filename.cxx」の手順に進む前に、VIsual Studioインストールのパスをvcvarsallバッチファイルまで取得し、以下に示すように構成を変更します。

* C:\ apps\MVS9\VC\vcvarsall.bat x86_AMD64 *

次のステップは

コンパイル-64ビット-DIPLIB = none filename.cxx

これで問題が解決しました

0
pratap