私は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ファイルをコンパイルしようとしているためです。明らかに私はこれをやっていません。
ありがとうございます。
私はWindowsでの構築に慣れていませんが、リンカが32ビットプログラムをリンクしようとしていて、64ビットオブジェクトファイルを与えていると思われます。あなたのプログラムをリンクするために 'ld'を直接使っているのはなぜですか?リンカーのフロントエンドとして 'x86_65-w64-mingw32-gcc'を使わないのはなぜですか?それは物事をリンクする伝統的な方法であり、コンパイラのフロントエンドがリンカに渡す特別な余分なオプションを知っているので、ほとんどの場合、より良い結果が得られます。 '-shared'オプションはminGWで動作しますか? 'ld'を使わなければならない場合は、おそらく64bitオブジェクトを使う方法を知る必要があります。 – MadScientist
こんにちは。応答していただきありがとうございます。私が言及したように、私はこのプログラムをWindows用にコンパイルするために他人のmakefileを変更しています。ldを使う代わりに、私はどのように問題に近づくでしょうか?私はx86_65-w64-mingw32-gcc -o <以前に生成されたすべてのオブジェクトファイル>と呼ぶだけでしょうか?また、x86_65-w64-mingw32-gccは64ビットコンパイラなので、なぜ32ビットプログラムをリンクしようとするのでしょうか? –
64ビットコンパイラは、通常、32ビットと64ビットのコードを生成できます。 32bit Intelは基本的に64bitのサブセットです。どんな理由であれ、特に明記しない限り、Windowsではコンパイラがデフォルトで32ビットコードを生成することが伝統的でした。したがって、生の 'ld'コマンドは32ビットを生成することを期待しています。あなたの他の質問については、マイクKinghanは彼の答えに詳細を提供しています。 – MadScientist