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'
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は同じファイル許可をサポートしないため、ビルド時に実行ビットが設定されません)、結果を実行します。
以下に、Mac OS Xでllvm/clangを使用してHello World .exeを構築するための段階的な手順を示します。
Homebrewでllvmをインストールします。これには、clangとllvmリンカーが含まれます。
brew install llvm
Visual Studio C++ライブラリとヘッダーにアクセスする必要があります。これらは、Windows 10仮想マシン(VM)またはWindows 10コンピューター上のVisual Studio 2017から利用できます。 WindowsにVisual Studioをインストールし、Visual Studioインストーラーから次の「個別コンポーネント」を含めます。
MacからMSVCライブラリとヘッダーにアクセスします。
以下に対応する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ライブラリにリンクします。
Mac OS XでMinGWを使用してWindowsバイナリをコンパイルすることを検討してください。 Linuxで実行する方法の手順は次のとおりです。 http://www.blogcompiler.com/2010/07/11/compile-for-windows-on-linux/
Mac OS Xに適合させる必要があり、MinGWを自分でコンパイルする必要がある場合があります。