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

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

本文关键字:OS 交叉编译 Windows 运行时 clang Visual Studio 2013 使用      更新时间:2023-10-16

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

交叉编译这样的简单示例需要什么:

#include <iostream>
int main() {
    std::cout << "Hello, world!n";
}

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

要求:

  • 叮当声的装置。我使用了Xcode 6.1中的Apple的clang(3.5)。
  • Visual Studio 2013 标头的副本。默认情况下,标准的Visual Studio 2013安装将对此C:Program Files (x86)Microsoft Visual Studio 12.0VCinclude。这也应该包含在速成版中。(/path/to/vs2013_include下文)
  • Visual Studio 2013 库的副本。默认情况下,标准的Visual Studio 2013安装将对此C:Program Files (x86)Microsoft Visual Studio 12.0VClib。这也应该包含在速成版中。(/path/to/vs2013_lib下文)
  • Windows SDK 的副本。这可以从Microsoft下载(例如,版本 7.1)。您可以在 C:Program Files (x86)Microsoft SDKsWindows 中找到现有安装。(/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 库和 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 被禁用。lld这些功能的Microsoft兼容性尚未完成。
  • 我无法在 Ubuntu 上成功执行链接步骤,它会触发 lld 中的断言。这仅在OS X上进行了测试。