我正在尝试使用Clang将C语言应用程序从Linux(64位)交叉编译为Windows(64位)。我读了page on cross-compilation,这对我来说并不太有帮助。
作为一个简单的测试,我在test.c
中有以下代码:
#include <stdio.h>
int main()
{
puts("hello world");
return 0;
}
到目前为止,我最好的猜测是clang -o test -target x86_64-win64-?ABI? test.c
。但是,我不知道ABI Windows 64位使用了什么。当我使用目标三元组x86_64-win64-abcdefg
运行clang时,它似乎编译正常 - 也就是说,它完成没有错误,并导致某些有效的二进制文件。这没有任何意义,考虑到abcdefg
绝对不是有效的ABI。由此产生的二进制文件对于这么小的程序来说太大了,Windows似乎认为它是一个16位程序(???)。反汇编它显示了对“linux”和“gnu”的引用,所以看起来Clang甚至都没有尝试为Windows编译。
定位win32(x86_64-win32-???ABI???
)会导致以下错误消息:
test.c:1:10: fatal error: 'stdio.h' file not found
#include <stdio.h>
^
1 error generated.
这个错误,如果我没弄错的话,是因为它不知道在哪里查找系统文件。我假设Clang确实在某处存储了Windows头文件,因为它声称能够交叉编译;但是哪里?如果没有,有什么地方可以下载吗?
是否有所有架构,系统和ABI的Clang支持的列表?交叉编译页面上的列表并不全面。
该页面还建议使用-mcpu=...
,但警告提示已过时。相反,正如警告所建议的那样,我尝试了-mtune=x86_64
。这似乎没有效果。考虑到目标三元组中指定了架构,这是否必要?
我已经看到一些文献表明我需要lld
,LLVM的实验性链接器。是这样的吗?我在编译lld时遇到了一些问题,如果可能的话我希望避免使用它。
答案 0 :(得分:1)
我在windows 10机器上安装了mobaxterm。有一个免费版本。它提供了一个xserver。它包含cygwin的安装,您可以启动本地终端。你只需输入:apt-get install clang和clang就可以编译并找到stdio.h而不会抱怨。
但是如果你打算不在mobaxterm / cygwin上运行生成的可执行文件,而是在windows本身内运行,你需要用mingwin编译。