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

时间:2017-06-10 20:51:55

标签: gcc makefile cygwin mingw

我正在尝试编译一个c ++程序而且我遇到了一些问题。特别是,当我使用x86_64-w64-mingw32-gcc作为我的编译器时,它会在我的编译中抱怨说#34; 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

其他一些说明:

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

提前致谢。

1 个答案:

答案 0 :(得分:5)

您正在使用64位编译器驱动程序w64-mingw32-gcc编译目标文件, 使用-m64,您明确指示它生成64位代码(不必要地, 因为那是它的默认值)。但是您正在使用没有的32位链接器进行链接 了解64位目标文件。

这种情况正在发生,因为在您的makefile中,您异常地调用了ld 明确地为您的增量solver链接:

COMMAND_LINK_SOLVER=ld -r -o $@ $^

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

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

COMMAND_LINK_SOLVER=$(GXX) -Wl,-r -o $@ $^

您可以依赖w64-mingw32-gcc来调用随其安装的ld

无需更正main链接,因为它已经以正确的方式完成。