2017-06-10 19 views
0

私はC++プログラムをコンパイルしようとしていますが、いくつか問題があります。特に、コンパイラとしてx86_64-w64-mingw32-gccを使用すると、 "tmp/src/libfastms/solver/solver.cpp.o:ファイルが認識されない:ファイル形式が認識されません"というコンパイルの途中でエラーが発生します。MinGWコンパイル "ファイルが認識されない:ファイル形式が認識されません"

私はmakeを実行したときにここにここに私のメイクファイル(ない鉱山、私はcygwinの環境にこのメイクファイルを適応しようとしている)https://pastebin.com/vgnVYJUL

がコンソール出力されている。

x86_64-w64-mingw32-gcc -c -o tmp/src/libfastms/solver/solver.cpp.o src/libfastms/solver/solver.cpp -Wall -O3 -m64 -Isrc/libfastms -DDISABLE_OPENMP -DDISABLE_OPENCV -DDISABLE_CUDA 
x86_64-w64-mingw32-gcc -c -o tmp/src/libfastms/solver/solver_base.cpp.o src/libfastms/solver/solver_base.cpp -Wall -O3 -m64 -Isrc/libfastms -DDISABLE_OPENMP -DDISABLE_OPENCV -DDISABLE_CUDA 
x86_64-w64-mingw32-gcc -c -o tmp/src/libfastms/solver/solver_host.cpp.o src/libfastms/solver/solver_host.cpp -Wall -O3 -m64 -Isrc/libfastms -DDISABLE_OPENMP -DDISABLE_OPENCV -DDISABLE_CUDA 
x86_64-w64-mingw32-gcc -c -o tmp/src/libfastms/util/has_cuda.cpp.o src/libfastms/util/has_cuda.cpp -Wall -O3 -m64 -Isrc/libfastms -DDISABLE_OPENMP -DDISABLE_OPENCV -DDISABLE_CUDA 
x86_64-w64-mingw32-gcc -c -o tmp/src/libfastms/util/image_mat.cpp.o src/libfastms/util/image_mat.cpp -Wall -O3 -m64 -Isrc/libfastms -DDISABLE_OPENMP -DDISABLE_OPENCV -DDISABLE_CUDA 
ld -r -o tmp/src/libfastms/libfastms.o tmp/src/libfastms/solver/solver.cpp.o tmp/src/libfastms/solver/solver_base.cpp.o tmp/src/libfastms/solver/solver_host.cpp.o tmp/src/libfastms/util/has_cuda.cpp.o tmp/src/libfastms/util/image_mat.cpp.o 
tmp/src/libfastms/solver/solver.cpp.o: file not recognized: File format not recognized 
Makefile:167: recipe for target 'tmp/src/libfastms/libfastms.o' failed 
make: *** [tmp/src/libfastms/libfastms.o] Error 1 

他のいくつかの注意事項:

  • 私はグラムでコンパイルするとき++
  • 一般的な解決策(唯一のMinGWのようです)私はこの問題はありませんこの問題は、残りのオブジェクトファイルのディレクトリを消去することです。これは動作しません。
  • もう1つの一般的な理由は、.hファイルをコンパイルしようとしているためです。明らかに私はこれをやっていません。

ありがとうございます。

+0

私はWindowsでの構築に慣れていませんが、リンカが32ビットプログラムをリンクしようとしていて、64ビットオブジェクトファイルを与えていると思われます。あなたのプログラムをリンクするために 'ld'を直接使っているのはなぜですか?リンカーのフロントエンドとして 'x86_65-w64-mingw32-gcc'を使わないのはなぜですか?それは物事をリンクする伝統的な方法であり、コンパイラのフロントエンドがリンカに渡す特別な余分なオプションを知っているので、ほとんどの場合、より良い結果が得られます。 '-shared'オプションはminGWで動作しますか? 'ld'を使わなければならない場合は、おそらく64bitオブジェクトを使う方法を知る必要があります。 – MadScientist

+0

こんにちは。応答していただきありがとうございます。私が言及したように、私はこのプログラムをWindows用にコンパイルするために他人のmakefileを変更しています。ldを使う代わりに、私はどのように問題に近づくでしょうか?私はx86_65-w64-mingw32-gcc -o <以前に生成されたすべてのオブジェクトファイル>と呼ぶだけでしょうか?また、x86_65-w64-mingw32-gccは64ビットコンパイラなので、なぜ32ビットプログラムをリンクしようとするのでしょうか? –

+0

64ビットコンパイラは、通常、32ビットと64ビットのコードを生成できます。 32bit Intelは基本的に64bitのサブセットです。どんな理由であれ、特に明記しない限り、Windowsではコンパイラがデフォルトで32ビットコードを生成することが伝統的でした。したがって、生の 'ld'コマンドは32ビットを生成することを期待しています。あなたの他の質問については、マイクKinghanは彼の答えに詳細を提供しています。 – MadScientist

答えて

1

あなたは、64ビットのコンパイラドライバを使用してオブジェクトファイルをコンパイルw64-mingw32-gcc、 と-m64で明示的に(つまり、デフォルトであるとして不必要、 )64ビット・コードを生成することを指示されています。しかし、 が64ビットオブジェクトファイルを理解していない32ビットリンカーとリンクしています。

これはあなたのインクリメンタルsolver連携のために、明示的にld を呼び出し、異常、ですので、あなたのメイクファイルで起こっている:

COMMAND_LINK_SOLVER=ld -r -o [email protected] $^ 

ではなく、通常の方法であなたのコンパイラドライバへのリンクを委任し、 32 -bit ldmingw-w64ツールチェーンに属する の前に、別のツールチェーンのPATHに見つかりました。

COMMAND_LINK_SOLVER=$(GXX) -Wl,-r -o [email protected] $^ 

あなたはそれと一緒にインストールされたldを呼び出すためにw64-mingw32-gccに依存することができます。あなたの solver連携するための手段

通常通りのコンパイラドライバを介してリンカーを起動し、この問題を回避するには、

mainリンケージは正しい方法で既に修正されているため、修正する必要はありません。

+0

うわー!どうもありがとう。今、そのステップを過ぎているようです。しかし、主なリンケージが不平を言っているようです。 x86_64-w64-mingw32-gcc -oメインtmp/src/examples/example_batchprocessing.cpp.o tmp/src/examples/example_gui.cpp.o tmp/src/examples/main.cpp.o tmp/src/libfastms /libfastms.o tmp/src/libfastms/libfastms.o:関数 'WinMainCRTStartup '内: /usr/src/debug/mingw64-x86_64-runtime-5.0.2-1/crt/crtexe.c:171:複数'WinMainCRTStartup 'の定義です。このエラーを検出した後、多くの人が、-cフラグを.cppファイルをコンパイルするために追加しないと、そのエラーが発生しているようです。ここではそうではない –

+0

@AlexKyriazisようこそStackoverflowへ。 [誰かが私の質問に答えたときに何をすべきですか?](https://stackoverflow.com/help/someone-answers)を参照してください。 あなた自身で解決できない別の問題が発生した場合は、 新しい質問をすることができます。 –

関連する問題