web-dev-qa-db-ja.com

Clang C ++ Cross Compiler-Mac OS XからWindows実行可能ファイルを生成する

MacでClangコンパイラを使用してXcodeを使用してC++アプリケーションを作成しました。

ソースファイルをコンパイルして、Windowsマシンで実行できる実行可能ファイルを作成したいのですが、Clangに実行可能ファイルを生成させることはできません。

ここに私が試したものがあります:

clang++ -std=c++11 -stdlib=libc++ -Arch x86_64 class1.cpp class2.cpp... -o executable.exe

これは実行可能ファイルを作成しますが、これは実行されません(Windowsでは、64ビットで実行できない16ビット-これを理解しないでください-を実行するとエラーが発生します)

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'

29
gavlaaaaaaaa

Clangは、原則としてクロスコンパイラとして使用できます。ほとんどのコンパイラとは異なり、clang/LLVMには、同じバイナリの異なるプラットフォーム用のコンポーネント(codegen、アセンブラ、リンカーなど)が含まれています。

しかし、生産能力でそれを使用しようとすると、多くの問題に直面します。

  • プラットフォームライブラリとヘッダーが必要です。 Windowsで動作する実行可能ファイルを生成するには、リンクするWindowsヘッダーとWindowsライブラリが必要です。動的リンクの場合はlibをインポートするか、静的リンクの場合は静的ライブラリをインポートします。 Visual Studioのインストールからこれらを取得できるはずです。

  • 名前マングリングやRTTIサポートなどの多くのC++機能は、Windowsでは完全ではありません。 Clangを使用したWindowsでのWindowsのコンパイルと同じ問題が発生します。 Windows C++のサポートは ほとんど完全 最近です。

  • LLVMプロジェクトにはlldリンカーが含まれていますが、これはx86 Windowsでホストできるほど十分に遠く、クロスプラットフォームリンカーとして機能する可能性がありますが、lldはまだclangディストリビューションの標準部分ではありません。 OS X上のClangは、Windows上のClang(link.exe)と同様に、デフォルトでOS Xプラットフォームリンカーldを使用します。 lldを入手してリンクする方法を理解するか、他のクロスプラットフォームリンカーを見つける必要があります。

  • Clangドライバーは、クロスプラットフォームコンパイラドライバーとして作成されていません。クロスプラットフォームのコンパイルを実行するには、より多くの実践的な作業が必要になる可能性があります。 clang -###の出力を見てください。clangドライバーがそのコマンドを作成しますが、clangドライバーと同じ作業の多くを手動で行う必要がある場合があります。また、clangはクロスプラットフォームコンパイルでのテストがはるかに少ないため、より多くのバグに遭遇する可能性があります。

  • Xcodeは、これらのいずれにも役立ちません。 OS XまたはiOS用にビルドするようにclangを構成できますが、Windowsにクロスプラットフォームビルドを手動で構成する必要があります。

LLVMベースの環境を組み合わせてOS XまたはLinuxでC「Hello、World」Windows exeを作成できるとは比較的確信していますが、Xcodeが「Windows」項目を可能なリストに追加する準備ができていませんターゲットプラットフォーム。


コンパイラ開発者でない場合は、おそらくソースコードをWindowsマシンにコピーし、Visual Studioでビルドすることをお勧めします。あなたがコンパイラ開発者である、またはコンパイラ開発者になりたい場合は、ぜひ、Clangのクロスコンパイル機能を推進してください。 Clang niversal driver プロジェクトはエキサイティングだと思うので、進歩を続けたいと思います。


私は逆のクロスコンパイルに成功しました:WindowsでMac OS X実行可能ファイルをコンパイルします。これは、小さなプログラムで手動で、つまり.cppファイルを直接コンパイルするのが非常に簡単であることが判明しました。

まず、Mac OS X開発ツールには、特定のOSのすべてのシステムライブラリとヘッダーを含む「SDK」が付属しています。ここでの最大の課題は、SDKのすべてのシンボリックリンクを保持しながら、SDKをWindowsに転送する方法を見つけることでした。 (何らかの理由でWindowsでシンボリックリンクを作成するには昇格された特権が必要なので、シンボリックリンクを使用してOS Xでtar.gzを作成した後、管理者としてWindowsで7Zipを実行してアーカイブを正しく展開する必要がありました。)

SDKがWindowsで使用可能になると、clangにすべてのシステム依存関係を取得する場所を示す単一のフラグ-isysrootがあります。これを-targetフラグと組み合わせることで、clangにOS X用の完全なオブジェクトファイルを作成する方法を伝えるために必要なものすべてが得られました。

コンパイラドライバーはlldとのクロスリンクの使用をサポートしていないように思われるため、リンクには手動でlldを使用しました。 lldは、ターゲットシステムライブラリを決定するための同様のフラグをサポートしています。

最後のステップは、生成された実行可能ファイルをOS Xマシンに単純にコピーし、実行許可を有効にして(Windowsは同じファイル許可をサポートしないため、ビルド時に実行ビットが設定されません)、結果を実行します。

23
bames53

以下に、Mac OS Xでllvm/clangを使用してHello World .exeを構築するための段階的な手順を示します。

Mac OS XでClang/LLVMを使用してWindows用のHello Worldをクロスコンパイルします

Homebrewでllvmをインストールします。これには、clangとllvmリンカーが含まれます。

brew install llvm

Visual Studio C++ライブラリとヘッダーにアクセスする必要があります。これらは、Windows 10仮想マシン(VM)またはWindows 10コンピューター上のVisual Studio 2017から利用できます。 WindowsにVisual Studioをインストールし、Visual Studioインストーラーから次の「個別コンポーネント」を含めます。

  • WindowsユニバーサルCRT SDK
  • WindowsユニバーサルCランタイム
  • UWP用のWindows 10 SDK(X.X.X.X):C++
  • VC++ 2017 vXXXツールセット(x86、x64)
  • Visual C++ 2017再頒布可能アップデート
  • C++/CLIサポート

MacからMSVCライブラリとヘッダーにアクセスします。

  • (オプション1)Windows VMを使用して、ホストとゲストの間に共有フォルダーを作成します。
  • (オプション2)Windowsコンピューターでリモート共有を作成し、Macからリモート共有に接続します。
  • (オプション3)ライセンス条項に従って、ライブラリとヘッダーをMacにコピーします。

以下に対応するllvm + MSVCインストール上の特定のディレクトリを見つけます。

// LLVM:
INCLUDES: /usr/local/Cellar/llvm/5.0.0/include

// MSVC:
INCLUDES: "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.11.25503\include"
LIBS: "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.11.25503\lib\x86"

// C Runtime Library (CRT):
INCLUDES: "C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\ucrt"
LIBS: "C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\ucrt"

// User-Mode Library (UM):
INCLUDES: "C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\um"
LIBS: "C:\Program Files (x86)\Windows Kits\10\Lib\10.0.15063.0\um\x86"

// 'Shared' includes:
INCLUDES: "C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\shared"

// WinRT includes:
INCLUDES: "C:\Program Files (x86)\Windows Kits\10\Include\10.0.15063.0\winrt"

// Figure out your MSC 'version', e.g.
Visual C++ 2012 (11.0)   -->     MSC_VER=1700
Visual C++ 2013 (12.0)   -->     MSC_VER=1800
Visual C++ 2015 (14.0)   -->     MSC_VER=1900
Visual C++ 2017 (15.0)   -->     MSC_VER=1910

Hello World srcを作成します。

// hello.cc

#include <cstdio>

int main(int argc, char* argv[]) {
  printf("Hello, World!\n");

  return 0;
}

Clangでコンパイルします。

clang -target i686-pc-win32 \
  -fms-compatibility-version=19 \
  -fms-extensions \
  -fdelayed-template-parsing \ 
  -fexceptions \
  -mthread-model posix \
  -fno-threadsafe-statics \
  -Wno-msvc-not-found \
  -DWIN32 \
  -D_WIN32 \
  -D_MT \
  -D_DLL \
  -Xclang -disable-llvm-verifier \
  -Xclang '--dependent-lib=msvcrt' \
  -Xclang '--dependent-lib=ucrt' \
  -Xclang '--dependent-lib=oldnames' \
  -Xclang '--dependent-lib=vcruntime' \
  -D_CRT_SECURE_NO_WARNINGS \
  -D_CRT_NONSTDC_NO_DEPRECATE \
  -U__GNUC__ \
  -U__gnu_linux__ \
  -U__GNUC_MINOR__ \
  -U__GNUC_PATCHLEVEL__ \
  -U__GNUC_STDC_INLINE__  \
  -I/usr/local/Cellar/llvm/5.0.0/include \
  -I/c/Program\ Files\ (x86)/Microsoft\ Visual\ Studio/2017/Community/VC/Tools/MSVC/14.11.25503/include \
  -I/c/Program\ Files\ (x86)/Windows\ Kits/10/Include/10.0.15063.0/ucrt \
  -I/c/Program\ Files\ (x86)/Windows\ Kits/10/Include/10.0.15063.0/shared \
  -I/c/Program\ Files\ (x86)/Windows\ Kits/10/Include/10.0.15063.0/winrt \
  -c hello.cc -o hello.o

Clangによって駆動されるlldリンカーとリンクします。

clang -Fuse-ld=lld -target i686-pc-win32 -Wl,-machine:x86 -fmsc-version=1900 \
  -o hello.exe hello.o \
  -L/external/code8-cc/cc/msvctoolchain/x86/lib/msvc \
  -L/external/code8-cc/cc/msvctoolchain/x86/lib/um \
  -L/code8-cc/cc/msvctoolchain/x86/lib/ucrt
  -nostdlib -lmsvcrt -Wno-msvc-not-found 

Hello.exeをWindowsコンピューターまたはWindows VMにコピーし、PowerShellで実行します。

.\hello.exe

64ビットバージョンをビルドするには、「-target x86_64-pc-win32」、「-Wl、-machine:x64」に変更し、x64ライブラリにリンクします。

28
Erik MC

Mac OS XでMinGWを使用してWindowsバイナリをコンパイルすることを検討してください。 Linuxで実行する方法の手順は次のとおりです。 http://www.blogcompiler.com/2010/07/11/compile-for-windows-on-linux/

Mac OS Xに適合させる必要があり、MinGWを自分でコンパイルする必要がある場合があります。

http://www.mingw.org

8
Jason