我使用Clang编译器在Mac上使用Xcode创建了C ++应用程序。
我想编译我的源文件以创建可以在Windows计算机上运行的可执行文件,但是我无法让Clang生成可执行文件。
这是我尝试过的:
clang++ -std=c++11 -stdlib=libc++ -arch x86_64 class1.cpp class2.cpp... -o executable.exe
这将创建一个可执行文件,但是它无法运行(Windows给我一个错误,原因是该应用程序为16位-不能理解这一点-无法在64位上运行)
clang++ -std=c++11 -stdlib=libc++ -target i386-pc-win32 class1.cpp class2.cpp
由于某种原因,每当我使用该-target
标志时,我都会收到一条错误消息,指出编译器无法找到<iostream>
标头,但是在其他任何时候它都不会抱怨。
我尝试使用,-Ipath/to/iostreamfolder/
但这不会产生任何更好的结果
任何建议都很好!谢谢!
我也尝试过该'-triple x86-pc-win32'
标志,但是收到此警告clang: warning: argument unused during compilation: '-triple x86-pc-win32'
原则上,Clang可以用作交叉编译器:与大多数编译器不同,Clang / LLVM在同一二进制文件中包含用于不同平台的组件(例如,代码生成器,汇编器和链接器)。
但是,在生产能力中尝试使用它时会遇到许多问题:
您需要平台库和标头。要生成将在Windows上运行的可执行文件,您需要要链接的Windows标头和Windows库,如果要动态链接,请导入lib,如果要静态链接,则需要静态lib。您应该能够从Visual Studio的安装中获得这些。
Windows上还没有完成许多C ++功能,例如名称处理和RTTI支持。在带有Clang的Windows上为Windows编译时,您将遇到这些相同的问题。 如今,Windows C ++支持已基本完成。
LLVM项目包括lld链接器,它显然已经足够远,可以在x86 Windows上自行托管,因此可能适合您作为跨平台链接器使用,但是lld尚不是clang发行版的标准部分。ld
与Windows(link.exe
)上的Clang一样,OS X上的Clang默认仍使用OS X平台链接器。您需要获取lld并弄清楚如何与它链接,或者找到其他跨平台链接器。
clang驱动程序未编写为跨平台编译器驱动程序。您可能需要做更多的动手工作才能运行跨平台编译。看一下:的输出,clang -###
clang驱动程序为您构造了该命令,但是您可能需要手工完成许多与clang驱动程序相同的工作。而且由于clang在跨平台编译时得到的测试少得多,因此您可能会遇到更多错误。
Xcode不会为您提供任何帮助。它可以将clang配置为针对OS X或iOS构建,但是您必须手动将跨平台构建配置为Windows。
我相对有信心可以将基于LLVM的环境拼凑在一起,以在OS X或Linux上构建C“ Hello,World” Windows exe,但是Xcode尚未准备好在可能的列表中添加“ Windows”项目标平台。
如果您不是编译器开发人员,则最好将源代码复制到Windows计算机并使用Visual Studio构建。如果您是或希望成为一名编译器开发人员,则一定可以帮助推动Clang的交叉编译能力向前发展。我认为Clang通用驱动程序项目令人兴奋,并且我真的很想看到进展继续。
我已经成功地完成了相反的交叉编译:在Windows上编译Mac OS X可执行文件。事实证明,在小型程序上手动进行操作非常容易,即直接编译.cpp文件。
首先,Mac OS X开发工具带有“ SDK”,其中包含特定操作系统的所有系统库和头文件。这里最大的挑战是弄清楚如何将SDK传输到Windows,同时保留SDK中的所有符号链接。(由于某种原因,在Windows上创建符号链接需要提升的特权,因此在OS X上使用符号链接生成tar.gz之后,我必须以管理员身份在Windows上运行7zip才能正确扩展档案。)
一旦Windows上提供了SDK,就可以通过一个标志告诉clang从哪里获取所有系统依赖项:-isysroot
。我将其与-target
标志结合在一起,以告诉clang如何为OS X生成完整的目标文件。
对于链接,我手动使用了lld,因为编译器驱动程序似乎不支持使用与lld的交叉链接。lld支持类似的标志来确定目标系统库。
最后一步只是将生成的可执行文件复制到OS X机器上,启用执行权限(Windows不支持相同的文件权限,因此在构建时不会设置执行位)并运行结果。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句