【发布时间】:2017-06-22 04:58:09
【问题描述】:
我正在尝试使用 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 时遇到了一些问题,如果可能的话,我想避免它。
【问题讨论】:
-
"如果您选择 Clang 不知道的参数,例如 blerg,它将忽略并假定未知,这并不总是需要,所以要小心。"这可能就是您选择
abcdefg时发生的情况。 -
@DYZ 好的,谢谢。如果只有一个有效参数列表或一些消息表明它不知道!
-
不是答案,但我找到了github.com/tpoechtrager/wclang——还没有尝试过。 "在 Linux/Unix 上使用 clang 轻松交叉编译 Windows 源代码"
-
wclang 为我工作,调用 clang-3.5 来构建目标文件,并调用 binutils ld 来链接。尝试通过 -fuse-ld=lld 使用 lld 时出现错误:“ELF 前端不支持 Windows 目标:i386pep”。这太糟糕了,因为我希望我有一个比 binutils ld 更快的交联器,在 $DAY_JOB 链接主可执行文件需要超过 10 分钟。
-
@JeffEpler 确保在运行 lld 时指定要为 Windows 交叉链接。您可能没有指定正确的 ABI?
标签: c windows clang llvm-clang