MinGW 编译 "file not recognized: File format not recognized"
MinGW compilation "file not recognized: File format not recognized"
我正在尝试编译 C++ 程序,但遇到了一些问题。特别是,当我使用 x86_64-w64-mingw32-gcc 作为我的编译器时,它在我的编译过程中抱怨 "tmp/src/libfastms/solver/solver.cpp.o: file not recognized: File format not recognized".
这是我的 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 文件。显然我不是这样做的。
提前致谢。
您正在使用 64 位编译器驱动程序编译目标文件,w64-mingw32-gcc
,
并且使用 -m64
您明确指示它生成 64 位代码(不必要的,
因为这是它的默认值)。但是您正在链接一个 32 位链接器,它不
了解 64 位目标文件。
发生这种情况是因为在您的 makefile 中,您不寻常地调用了 ld
明确为您的增量 solver
链接:
COMMAND_LINK_SOLVER=ld -r -o $@ $^
而不是以通常的方式将链接委托给您的编译器驱动程序,并且
之前在您的 PATH
中发现来自不同工具链的 32 位 ld
属于您的 mingw-w64
工具链的 64 位版本。
为避免这种情况,请照常通过编译器驱动程序调用链接器,这对您
solver
联动表示:
COMMAND_LINK_SOLVER=$(GXX) -Wl,-r -o $@ $^
您可以依靠 w64-mingw32-gcc
来调用随它一起安装的 ld
。
无需更正您的 main
链接,因为它已经以正确的方式完成。
我正在尝试编译 C++ 程序,但遇到了一些问题。特别是,当我使用 x86_64-w64-mingw32-gcc 作为我的编译器时,它在我的编译过程中抱怨 "tmp/src/libfastms/solver/solver.cpp.o: file not recognized: File format not recognized".
这是我的 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 文件。显然我不是这样做的。
提前致谢。
您正在使用 64 位编译器驱动程序编译目标文件,w64-mingw32-gcc
,
并且使用 -m64
您明确指示它生成 64 位代码(不必要的,
因为这是它的默认值)。但是您正在链接一个 32 位链接器,它不
了解 64 位目标文件。
发生这种情况是因为在您的 makefile 中,您不寻常地调用了 ld
明确为您的增量 solver
链接:
COMMAND_LINK_SOLVER=ld -r -o $@ $^
而不是以通常的方式将链接委托给您的编译器驱动程序,并且
之前在您的 PATH
中发现来自不同工具链的 32 位 ld
属于您的 mingw-w64
工具链的 64 位版本。
为避免这种情况,请照常通过编译器驱动程序调用链接器,这对您
solver
联动表示:
COMMAND_LINK_SOLVER=$(GXX) -Wl,-r -o $@ $^
您可以依靠 w64-mingw32-gcc
来调用随它一起安装的 ld
。
无需更正您的 main
链接,因为它已经以正确的方式完成。