在Linux上使用Mingw和Clang进行交叉编译

7
我试图在Linux下为Windows编译。我已经安装了适用于Linux和w64-mingw的binutils多库。如果我使用x86_64-w64-mingw-gcc编译,一切都正常,但是如果我使用clang并加上-target x86_64-w64-mingw或x86_64-windows-gnu,则编译器会给出大量警告,并出现windows.h的包含错误。
问题出在哪里?Clang不支持mingw binutils吗?
另外,我也对为FreeBSD进行交叉编译感兴趣,请问在哪里可以找到针对FreeBSD的binutils?
非常感谢您的帮助 :)
2个回答

8

-target不够用,您还需要指定包含目录,即:

clang -target i686-w64-mingw32 -nostdinc -fno-exceptions -isystem /opt/compiler/llvm-3.6/bin/../lib/clang/3.6.0/include -isystem /opt/compiler/mingw-w64/i686-w64-mingw32/include -isystem /opt/compiler/mingw-w64/i686-w64-mingw32/include/c++/4.9.2 -isystem /opt/compiler/mingw-w64/i686-w64-mingw32/include/c++/4.9.2/backward -isystem /opt/compiler/mingw-w64/i686-w64-mingw32/include/c++/4.9.2/i686-w64-mingw32

你可能会发现我的项目有用:https://github.com/tpoechtrager/wclang - 这个工具可以为你完成所有繁琐的包含目录搜索。

是的,我尝试了你的项目,它非常有用,但我想学习如何为其他架构做到这一点。 然而,我尝试了以下命令: clang -target i686-w64-mingw32 -nostdinc -fno-exceptions -isystem /usr/lib/llvm-3.5/bin/../lib/clang/3.5.0/include -isystem /usr/lib/gcc/i686-w64-mingw32/4.9-win32/include -isystem /usr/lib/gcc/i686-w64-mingw32/4.9-win32/include/c++ -isystem /usr/lib/gcc/i686-w64-mingw32/4.9-win32/include/c++/backward -isystem /usr/lib/gcc/i686-w64-mingw32/4.9-win32/include/c++/i686-w64-mingw32 *.c lib/*.c -otest 现在加上-nostdinc后,它找不到stdio.h。 - NickF_93
运行 w32-clang -wc-verbose dummy.c / w64-clang -wc-verbose dummy.c 命令以查看包含路径。 - Thomas

1

我的ELLCC项目提供了将Clang与库和包含文件打包的功能,可以针对多个目标进行编译,包括各种Linux目标和使用MinGW-64包含文件和库的Windows。我有一个稍微修改过的Clang版本,称为ecc,它支持配置文件来指定获取包含文件的位置、如何链接等。适用于Clang/Mingw的典型配置文件看起来像this。我已经修改了Clang的-target选项,以检查是否存在适用的配置文件,并在存在时使用它。例如,要针对64位Windows进行编译,您可以使用以下命令行:

ecc -target x86_64-w64-mingw32 hello.c

要编译同一程序,例如针对ARM Linux系统,您可以使用类似以下命令行的方式:
ecc -target arm-linux-engeabihf hello.c

支持的目标平台完整列表在此处可用。各种Linux主机和Windows的预编译二进制软件包可用。这些软件包包括支持所有目标平台的binutils和GDB。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接