我正在尝试使用Clang将C语言应用程序从
Linux(64位)交叉编译为Windows(64位).我读了
page on cross-compilation,这不太有帮助.
作为一个简单的测试,我在test.c中有以下代码:
#include
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
^
1 error generated.
如果我没弄错的话,这个错误是因为它不知道在哪里查找系统文件.我假设Clang确实在某处存储了Windows头文件,因为它声称能够交叉编译;但是哪里?如果没有,有什么地方我可以下载它们吗?
是否列出了所有架构,系统和ABI的Clang支持?交叉编译页面上的列表并不全面.
该页面还建议使用-mcpu = …,但警告表明它已过时.相反,正如警告所建议的那样,我尝试了-mtune = x86_64.这似乎没有效果.考虑到目标三元组中指定的体系结构,这是否是必要的?
我已经看到一些文献表明我需要lld,LLVM的实验连接器.是这样的吗?我有一些问题编译lld,并希望尽可能避免它.