簡體   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