使用Clang从Linux到Windows的交叉编译

时间:2017-02-05 01:34:42

标签: c windows clang llvm-clang

我正在尝试使用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时遇到了一些问题,如果可能的话我希望避免使用它。

1 个答案:

答案 0 :(得分:1)

我在windows 10机器上安装了mobaxterm。有一个免费版本。它提供了一个xserver。它包含cygwin的安装,您可以启动本地终端。你只需输入:apt-get install clang和clang就可以编译并找到stdio.h而不会抱怨。

但是如果你打算不在mobaxterm / cygwin上运行生成的可执行文件,而是在windows本身内运行,你需要用mingwin编译。