铿锵C ++交叉编译器 – 从Mac OS X生成Windows可执行文件

我使用Clang编译器在Mac上创build了一个使用Xcode的C ++应用程序。

我想编译我的源文件来创build一个可以在Windows机器上运行的可执行文件,但是我不能让Clang生成一个可执行文件。

这是我试过的:

clang++ -std=c++11 -stdlib=libc++ -arch x86_64 class1.cpp class2.cpp... -o executable.exe 

这创build了一个可执行文件,但是这不能运行(Windows给了我一个与应用程序是16位的错误 – 不明白这一点,不能运行在64位)

 clang++ -std=c++11 -stdlib=libc++ -target i386-pc-win32 class1.cpp class2.cpp 

由于某种原因,每当我使用-target标志,我得到一个错误,指出编译器找不到<iostream>标题,但从来没有呻吟任何其他时间。
我已经尝试使用-Ipath/to/iostreamfolder/然而这并没有产生任何更好的结果

任何build议将是伟大的! 谢谢!

我也试过'-triple x86-pc-win32'标志,但是我得到这个警告clang: warning: argument unused during compilation: '-triple x86-pc-win32'

Clang原则上可以用作交叉编译器:与大多数编译器不同,clang / LLVM在同一个二进制文件中包含不同平台的组件(如codegen,汇编器和链接器)。

然而,你会遇到一些问题,试图在生产能力中使用它:

  • 你需要平台库和头文件。 要生成可在Windows上运行的可执行文件,需要连接到Windows头文件和Windows库,如果是动态链接,则需要导入库,静态链接需要静态库。 你应该能够从Visual Studio的安装中获取这些信息。

  • Windows上的许多C ++功能(如名称修饰和RTTI支持)都不完整。 用Clang在Windows上编译Windows也会遇到同样的问题。 Windows C ++支持现在已经非常完整了 。

  • LLVM项目包括lld连接器,它显然已经足够远了,它可以在x86 Windows上自行托管,因此可以作为跨平台连接器工作,但是lld还不是clang发行版的标准部分。 Clang在OS X上仍然使用OS X平台链接器ld ,就像Windows上的Clang( link.exe )一样。 您需要获取lld并找出如何与其链接,或者找到其他跨平台链接器。

  • clang驱动程序不是作为跨平台编译器驱动程序编写的。 您可能需要做更多的实际操作才能运行跨平台编译。 看一下clang -###的输出结果clang -###叮当声驱动程序为你构建了这个命令,但是你可能需要手动完成与叮当声驱动程序完全相同的工作。 而且由于铿锵的跨平台编译测试要少得多,所以你可能会遇到更多的错误。

  • Xcode不会帮你解决这个问题。 它可以配置clang来为OS X或iOS构建,但是您必须手动将跨平台构建配置到Windows。

我相对相信一个人可以拼凑一个基于LLVM的环境来在OS X或Linux上构建一个C“Hello,World”Windows exe文件,但是它还没有准备好让Xcode在可能的列表中添加一个“Windows”项目标平台。


如果你不是一个编译器开发人员,你可能最好把源代码复制到Windows机器上,并用Visual Studio编译。 如果你是或者想成为一名编译器开发人员,那么一定要帮忙推动Clang的交叉编译能力。 我认为铿锵通用驱动程序项目是令人兴奋的,我真的希望看到进展继续。


我已经成功完成了相反的交叉编译:编译Windows上的Mac OS X可执行文件。 事实证明,在小程序上手动操作相当容易,也就是直接编译一个.cpp文件。

首先,Mac OS X开发工具带有“SDK”,其中包含特定操作系统的所有系统库和头文件。 这里最大的挑战是如何将SDK传输到Windows,同时保留SDK中的所有符号链接。 (出于某种原因,在Windows上创建符号链接需要提升权限,因此,在OS X上生成tar.gz并使用符号链接后,我必须以管理员身份在Windows上运行7zip才能正确展开存档。)

一旦SDK在Windows上可用,就有一个标志告诉clang在哪里获得所有的系统依赖关系: -isysroot 这与-target标志结合在一起就是我需要告诉叮当声如何为OS X生成完整的目标文件。

对于链接我手动使用lld,因为编译器驱动程序似乎不支持与lld交叉链接。 lld支持类似的标志来确定目标系统库。

最后一步是将生成的可执行文件复制到OS X机器上,启用执行权限(Windows不支持相同的文件权限,以便在构建时不会执行位),并运行结果。

以下是在Mac OS X上使用llvm / clang构建Hello World .exe的分步说明。

在Mac OS X上使用Clang / LLVM交叉编译Hello World for Windows

用自制软件安装llvm。 这将包括铛和llvm链接器。

 brew install llvm 

您需要访问Visual Studio C ++库和头文件,这些头文件可以在Windows 10虚拟机(VM)或Windows 10计算机上通过Visual Studio 2017获得。 在窗口上安装Visual Studio,并通过Visual Studio安装程序包含以下“单个组件”:

  • Windows通用CRT SDK
  • Windows通用C运行时
  • 用于UWP的Windows 10 SDK(XXXX):C ++
  • VC ++ 2017 vXXX工具集(x86,x64)
  • Visual C ++ 2017可再发行的更新
  • C ++ / CLI支持

从Mac访问MSVC库和标题。

  • (选项1)使用Windows VM并在主机和来宾之间创建一个共享文件夹。
  • (选项2)在Windows计算机上创建一个远程共享,并通过Mac连接到该共享。
  • (选项3)按照任何许可条款,将库和标题复制到Mac。

在MSVC安装中找到与以下内容相对应的特定目录:

 // MSVC: INCLUDES: "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.11.25503\include" LIBS: "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.11.25503\lib\x86" // C Runtime Library (CRT): INCLUDES: "C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\ucrt" LIBS: "C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\ucrt" // User-Mode Library (UM): INCLUDES: "C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\um" LIBS: "C:\Program Files (x86)\Windows Kits\10\Lib\10.0.15063.0\um\x86" 

创建你的Hello World src:

 // hello.cc #include <cstdio> int main(int argc, char* argv[]) { printf("Hello, World!\n"); return 0; } 

编译并链接到llvm lld链接器:

 clang -fuse-ld=lld -target i386-pc-win32 -o hello.exe hello.cc \ -I/c/Program\ Files\ (x86)/Microsoft\ Visual\ Studio/2017/Community/VC/Tools/MSVC/14.11.25503/include \ -I/c/Program\ Files\ (x86)/Windows\ Kits/10/Include/10.0.15063.0/ucrt \ -L/c/Program\ Files\ (x86)/Microsoft\ Visual\ Studio/2017/Community/VC/Tools/MSVC/14.11.25503/lib/x86 \ -L/c/Program\ Files\ (x86)/Windows\ Kits/10/Include/10.0.15063.0/ucrt \ -L/c/Program\ Files\ (x86)/Windows\ Kits/10/Lib/10.0.15063.0/um/x86 \ -Wno-expansion-to-defined \ -Wno-msvc-not-found \ -Wno-ignored-attributes \ -D_CRT_SECURE_NO_WARNINGS 

将hello.exe复制到Windows计算机或Windows VM并在PowerShell中运行:

 .\hello.exe 

要构建64位版本,请更改上面的目标并链接到x64库。

考虑在Mac OS X上使用MinGW编译Windows二进制文件。 以下是有关如何在Linux上执行操作的说明: http : //www.blogcompiler.com/2010/07/11/compile-for-windows-on-linux/

你必须适应Mac OS X,你可能需要自己编译MinGW。

http://www.mingw.org