2016-07-13 36 views
0

64ビットWindowsで32ビットプログラムをコンパイルしてリンクしようとしています。 私はそれが正常にコンパイルされるのnasmlink.exe、Kernel32.libの64ビット版または32ビット版を選択

nasm -f win32 test.asm 

で私のプログラムをコンパイルしました。私はLINK.EXE

link /entry:start /subsystem:console test.obj Kernel32.lib 

または

link /machine:x86 /entry:start /subsystem:console test.obj Kernel32.lib 

とリンクしようとすると、しかし、それは私に、このエラーを与える:

C:\Program Files (x86)\Windows Kits\8.1\lib\winv6.3\um\x64\Kernel32.lib : warnin 
g LNK4272: library machine type 'x64' conflicts with target machine type 'X86' 
test.exe : fatal error LNK1120: 3 unresolved externals 

しかし、私は、カーネル32の32ビットバージョンの絶対パスを書きます.libは正常にリンクします。私はパス変数として32bit Kernel32.libの場所をどこかに追加すべきだと思うか、スイッチを使うべきだが見つけられない。

絶対パスを書き込まないとリンクする方法はありますか?

+0

'/ libpath'を使用してパスを設定しますか? –

+0

はい、動作しますが、私はこの情報をリンカに永久に与えようとしています。 (環境変数として)。リンカーは.objファイルが32ビットであることを理解しなければならず、32ビットバージョンのライブラリを検索する必要があります。なぜ私のコンピュータでこれが起こっているのかわかりません。 VSとWindowsは他のコンピュータと同じですが、私にとっては唯一のことです。そして、私は他のプロジェクトのリンカー設定を変更していないことを確信しています。(私もdumpbinで.objファイルヘッダーをチェックしてあり、それらは32ビットです) – ApprenticeTheSecond

+0

解決策を質問に編集しないでください。受け入れられた回答に対するあなたのコメントは、そのコメントが属する唯一の場所です。 –

答えて

2

適切な環境変数で正しく設定されたコマンドプロンプトからリンカー(およびその他のSDKツール)を実行する必要があります。そうすれば、この問題は起こりません。

これを行う最も簡単な方法は、提供されたバッチファイルを実行することです。 vcvarsall.batがマスタの場合は、使用するビルド環境のタイプを指定する1つの引数とともに使用します。 32ビットの場合はx86、64ビットツールチェーンを使用する場合はamd64、64ビットのツールチェーンを使用する場合はx86_amd64、64ビットのビルドの場合はx86_amd64(32ビットクロスコンパイラの64ビット)です。あるいは、個々のバッチファイルvcvars32.batvcvars64.bat、およびvcbarsx86_amd64.batを使用することもできます。

あなたはこれらのファイルを自分で調べて、どのような環境変数を設定しているのか見ることができますが、実際に行った設定をリバースエンジニアリングする価値はありません。関連する部分は、Windows SDKのインストールのルートディレクトリに環境変数%WindowsSdkDir%を設定し、その設定に使用している:

  1. PATHが適切なbinサブディレクトリが含まれるように、link.exeを含むツールを含みます。 x86とx86_amd64では、それはちょうどbinです。 amd64の場合、サブディレクトリはbin\x64です。

  2. INCLUDE適切なincludeサブディレクトリ(これはすべてのビルドタイプで同じです)を含むサブディレクトリです。

  3. LIBから適切なlibサブディレクトリ(リンカの動的スタブを含む)。 x86では、これはちょうどlibです。 amd64とx86_amd64の場合、サブディレクトリはlib\x64です。

明らかに欠けているものが最後です。リンカーは、LIBファイルの正しいディレクトリを探していません。 machineスイッチに基づいて自動的には実行されません。ビルドシステムをどのように設定したのか、SDKファイルをどこにインストールしたのかは分かりません。バッチファイルを使用して、すべての設定を最小限の手間で正しく設定します。

+0

後悔して申し訳ありません。あなたが言ったように、私はvcvarxxx.batファイル内のすべての環境変数とその使用法をチェックしました。実際に彼らはすべて正しかった:)。間違いは、私がVC2015 x64 CPを使用していたことを(私はこれを言うのが恥ずかしいです): – ApprenticeTheSecond

関連する問題