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

Rog*_*gue 6 c windows clang llvm-clang

我正在尝试使用Clang将C语言应用程序从Linux(64位)交叉编译为Windows(64位).我阅读了关于交叉编译页面,这我没有太大帮助.

作为一个简单的测试,我有以下代码test.c:

#include <stdio.h>

int main()
{
        puts("hello world");
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我最好的猜测是clang -o test -target x86_64-win64-?ABI? test.c.但是,我不知道ABI Windows 64位使用了什么.当我使用目标三元组运行clang时x86_64-win64-abcdefg,它似乎编译正常 - 也就是说,它完成没有错误并导致某些有效的二进制文件.这没有任何意义,考虑到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.
Run Code Online (Sandbox Code Playgroud)

如果我没弄错的话,这个错误是因为它不知道在哪里查找系统文件.我假设Clang确实在某处存储了Windows头文件,因为它声称能够交叉编译; 但是哪里?如果没有,有什么地方我可以下载它们吗?

是否列出了所有架构,系统和ABI的Clang支持?交叉编译页面上的列表并不全面.

该页面还建议使用-mcpu=...,但警告表明它已过时.相反,正如警告所建议的那样,我试过了-mtune=x86_64.这似乎没有效果.考虑到目标三元组中指定的体系结构,这是否是必要的?

我已经看到一些文献表明我需要lldLLVM的实验连接器.是这样的吗?我有一些问题编译lld,并希望尽可能避免它.

小智 -7

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

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

  • 这并不能回答问题。问题是关于从 Linux 构建,而不是从 Windows 构建。 (2认同)