繁体   English   中英

使用clang和Visual Studio 2013运行时从OS X交叉编译到Windows

[英]Cross-compiling from OS X to Windows using clang and the Visual Studio 2013 runtime

我想在OS X上使用clang生成与Visual Studio 2013运行时链接的Windows二进制文件,但如果没有MSVC的link.exe如何使clang生成正确的目标文件和链接并不是很明显。 我的Windows机器上的目标三重clang -v报告是i686-pc-windows-msvc但OS X上使用-target选项的clang不接受这一点。

如何交叉编译这样一个简单的例子:

#include <iostream>

int main() {
    std::cout << "Hello, world!\n";
}

这有点实验性。 这个例子可以成功编译和链接,但我现在不希望以这种方式构建一个大而复杂的项目(例如Chromium)。

要求:

  • 安装clang。 我使用了Xcode 6.1中的Apple铿锵声(3.5)。
  • Visual Studio 2013标头的副本。 默认情况下,标准的Visual Studio 2013安装会将其放在C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\include 这也应包含在快递版中。 /path/to/vs2013_include如下)
  • Visual Studio 2013库的副本。 默认情况下,标准的Visual Studio 2013安装会将其放在C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\lib 这也应包含在快递版中。 /path/to/vs2013_lib如下)
  • Windows SDK的副本。 这可以从Microsoft下载(例如,版本7.1 )。 您可以在C:\\Program Files (x86)\\Microsoft SDKs\\Windows找到现有安装。 (下面是/path/to/windows/sdk/vX.X/Lib
  • lld的构建,llvm链接器。 它尚未完全完整,必须按照其网站上的说明进行构建。

程序:

将此文件另存为test.cpp

#include <iostream>

int main() {
    std::cout << "Hello, world!\n";
}

首先,运行clang(使用路径指向VS2013标头替换的位置):

clang++ -target i386-pc-win32 -isystem /path/to/vs2013_include -std=c++11 -fms-extensions -fms-compatibility -fdelayed-template-parsing -fno-rtti -fno-exceptions -D_HAS_EXCEPTIONS=0 -D_ITERATOR_DEBUG_LEVEL=0 -fmsc-version=1800 -c test.cpp

这应该生成test.o

然后,运行链接器(使用相应的VS2013 lib和WinSDK目录):

lld -flavor link /libpath:/path/to/vs2013_lib /libpath:/path/to/windows/sdk/vX.X/Lib kernel32.lib user32.lib shell32.lib /subsystem:console libcmt.lib test.o

这应该生成可以在Windows上运行的test.exe

笔记:

  • 正如您在clang的调用中所看到的,异常和RTTI被禁用。 Microsoft对这些lld功能的兼容性尚未完成。
  • 我无法在Ubuntu上成功执行链接步骤,它会在lld触发断言。 这只在OS X上测试过。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM