使用 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
,但使用 -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上进行了测试。
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 用于交叉编译和CMake的预处理器宏的单元测试
- 在Linux上使用Clang / OLLVM交叉编译helloworld Windows可执行文件时的问题
- 无法使用 aarch64-unknown-nto-qnx7.0.0-g++-5.4.0 编译器交叉编译 QNX 平台的
- 如何使用导出的函数交叉编译 DLL
- 交叉编译:特殊的交叉编译器还是只是带有选项 -march 的 gcc?
- 交叉编译时包括外部库
- 如何交叉编译C++文件
- SFML 交叉编译 for Windows on Linux.
- 使用 cmake 交叉编译 libwebsockets
- 使用cmake交叉编译gRPC
- 为什么Qt必须从源代码构建以进行交叉编译?
- 交叉编译树莓派
- Microsoft Visual Studio 2019交叉编译CMake库 - 有效,但存在SEG错误
- Jlibfprint 交叉编译
- 在Linux上交叉编译Windows应用程序时如何链接到Winsock?
- GPS 的交叉编译显示"unrecognized option"
- clang 交叉编译命令找不到头文件
- FFMPEG 2.8.x 交叉编译错误在 Mac OS X 10.10 上
- 使用 clang 和 Visual Studio 2013 运行时从 OS X 交叉编译到 Windows