MinGW编译“无法识别文件:无法识别文件格式”

Ale*_*zis 2 gcc cygwin mingw makefile

我正在尝试编译C ++程序,但遇到了一些问题。特别是,当我使用x86_64-w64-mingw32-gcc作为编译器时,它在我的编译过程中抱怨“ tmp / src / libfastms / solver / solver.cpp.o:无法识别文件:无法识别文件格式”。

这是我的makefile(不是我的,我是在尝试使此makefile适应cygwin环境)https://pastebin.com/vgnVYJUL

这是我运行make时的控制台输出:

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
Run Code Online (Sandbox Code Playgroud)

其他注意事项:

  • 使用g ++编译时,我没有这个问题(似乎只是minGW)
  • 解决此问题的常用方法是清除残留目标文件的目录。这是行不通的。
  • 另一个常见原因是试图编译.h文件。显然我没有这样做。

提前致谢。

Mik*_*han 6

您正在使用64位编译器驱动程序编译目标文件w64-mingw32-gcc,并-m64明确地将其定向以生成64位代码(不必要,因为这是默认设置)。但是,您正在链接的32位链接器无法理解64位目标文件。

发生这种情况的原因是,在生成文件中,您通常会ld 显式地调用增量solver链接:

COMMAND_LINK_SOLVER=ld -r -o $@ $^
Run Code Online (Sandbox Code Playgroud)

而不是以通常的方式将链接委派给编译器驱动程序,而是在属于您的工具链的64位链接之前,ld找到了来自其他工具链的32位链接。PATHmingw-w64

为了避免这种情况,请像平常一样通过编译器驱动程序调用链接器,这对于您的 solver链接意味着:

COMMAND_LINK_SOLVER=$(GXX) -Wl,-r -o $@ $^
Run Code Online (Sandbox Code Playgroud)

您可以依赖w64-mingw32-gcc调用与ld它一起安装的。

不需要纠正您的main链接,因为它已经以正确的方式完成了。