web-dev-qa-db-ja.com

C ++クロスプラットフォームコンパイル

Windows 7-32bitオペレーティングシステムを使用しています。

シンプルなC++ソースコードをすべてのOSとアーキテクチャの実行可能ファイルにコンパイルしたい。

私のOSから以下のオペレーティングシステム用にコンパイルしたいです。

  • Windows 32
  • Windows 64
  • Linux 32
  • Linux 64
  • OSX 32
  • OSX 64

可能ですか?

注: Win7 32ビットのみですべてのOSのC++をコンパイルする必要があります。

18
Chandra Nakka

クロスコンパイルするよりも、ターゲットOSでコンパイルする方がはるかに簡単です。必要なのは、すべてのOSのツールチェーンと「メイク」ツールです。 CMakeには強力なクロスコンパイル機能があります。必要ではありませんが、ある程度のお金を節約できます。仮想化ソフトウェア(VMWare Playerは無料など)を入手して、異なるOSを実行します。

ツールチェーンとしてclang(OSX)、gcc(Linux)、TDM gcc(Windows)をお勧めします(MSVCもいいですが、無料ではありません)。 32ビットと64ビットの違いは問題になりません。さまざまなコンパイラーを使用している場合は、各コンパイラーの最もペダンティックなフラグをオンにして、標準に準拠することをお勧めします。

また、OSターゲットとアーキテクチャごとに1つのクライアントを持つどこかに継続的統合サーバーを設置することをお勧めします。これにより、1つのOSで行う互換性のない変更の苦痛が緩和されます。また、パッケージマネージャーまたはインストーラーによるインストールを確認することもできます。

クロスコンパイル、ツールチェーン、継続的インテグレーションの詳細については、Webを検索してください。

29
Stefan Weiser

自動ツールやCMakeのようなビルドシステムが必要です。後者をお勧めします。 Pythonという名前のユーティリティ cookiecutter があり、Python(BoilerplatePPテンプレート)。そのリンクには、それを使用して開始プロジェクトを作成する方法に関する指示があります。初期プロジェクトは次のようになります。

$ tree cpp/
cpp/
├── CMakeLists.txt
├── README.md
├── include
│   └── Calculator.hpp
├── src
│   ├── CMakeLists.txt
│   └── Calculator.cpp
├── test
│   ├── CMakeLists.txt
│   └── CalculatorTests.cpp
└── thirdparity
    └── catch
        └── include
            └── catch.hpp

CMakeは、バージョン2.6からのクロスコンパイルをサポートしています。 この記事 を読んで、この問題に関する洞察を得てください。幸運を。

11
aaragon

CMakeの使用を開始して、すべてのOSでプロジェクトをコンパイラ用に準備できます。

特別な場合には、使用しているOSのプリプロセッサチェックを含むコードを調整する必要があります。例えば:

#ifdef WIN32
//do some stuff for Windows
#Elif __Apple__
//do some stuff for Apple
#Elif __linux__
//do stuff for Linux
#endif

この link で、すべての定義済みマクロのリストを見つけることができます。

Win7 32ビットのみを使用してすべてをクロスコンパイルするには、GCCクロスコンパイラを使用できます。これまでのところ、GCCまたはCLANGはWindows、MacおよびLinuxで利用可能な唯一のコンパイラです。 Windows 32ビットのみではなく、他のターゲット向けにプロジェクトをビルドする場合は、このWikiに従ってください

[〜#〜] gcc [〜#〜]

7
madduci

Golangは 簡単なクロスコンパイル ($ GOOSと$ GOARCHを指定して「ビルドを実行」)を提供します。要件に応じて(ハードRTOSが必要な場合など)、ジョブに適したツールになる場合があります。

2
Homer Simpson

短い答えはイエスだと思いますが、詳細はあります(悪魔は常に詳細に隠れています)。簡単に言えば、ソースの互換性とツールチェーンの互換性という2つの質問があります。

  1. ツールチェーンの互換性。ここでは、コンパイラ、ライブラリ、ビルドツールの3つの部分を考慮する必要があります。幸い、ビルドツールは存在しますが、存在しません。それはすべての生まれ変わり、cmake、ninjaなどで有名なメイクです。私はcmakeが最も簡単なものを好むが、あなたはいつでも好きな武器を拾うことができる。コンパイラ。 GCCは良い選択ですが、今日はCLangもあり、これも良い選択です。 CLangは、Windowsでよりクリーンでより適切にサポートされている、より興味深いソリューションであると確信しています。別の良い選択はIntel C++/Cですが、コストがかかります。別の方法は、異なるシステムに異なるコンパイラを使用することであり、これも悪い選択ではありません。ブーストはそれを行い、ブーストチームは最高の1つです。ブースト設定を掘り下げ、多くの興味深いマクロとヘッダーを取得できます。 C++標準ライブラリおよびその他のライブラリ。これは最も難しいことの1つです。 C++はやや標準ですが、更新後に問題が発生する可能性があります。他のライブラリは、特定のシステムに使用するコンパイラでビルドする必要があります。したがって、ライブラリバンドルでソフトウェアを配布する準備をしてください。別の良いオプションは、QtやWxWidgetsのようなサードパーティのクロスプラットフォームライブラリに依存することです。

  2. ソースの互換性は、特定のさまざまなOSサブシステムの実装で緊密に利用可能です。たとえば、スレッド、共有メモリ、ソケット、分散収集I/O、GUI。通常、それほど複雑ではありませんが、すべてのラッパーを作成するには時間がかかります。

2
Tanuki

前に回答したように、 CMake は最高のクロスプラットフォームコンパイルツールチェーンです。上記のすべてのプラットフォーム用のVisual Studioソリューション、Makefile、Eclipseプロジェクトなどを生成します。

また、 SCons を試すこともできます。これは少し知られていませんが、少し単純です

1

cmakeは、ツールチェーンとOSの依存関係をすべて抽象化するため、メタ言語として使用されます。確かに便利ですが、初めて使用するのは難しいかもしれません...

本当に必要なのは、とにかくcmakeが舞台裏で使用するものです:1.各ターゲットOS用のコンパイラー2.よく書かれたメイクファイル

フラグをオンにしてmakefileの動作を変更するか、コードをビルドするときに適切なコンパイラ(目的のOS)を呼び出すだけで本当に必要なバージョンを削除できます。

1
Pandrei

技術的に言えば、Windowsで同じコードをコンパイルしたい場合は、技術的に言えば、それを指摘するだけです7 butこれらの他のOSをターゲットに、次に必要なのは、Windowsで動作するすべての異なるターゲット用のクロスコンパイラです。そのためには、CygwinまたはMinGW32を使用してクロスをビルドすることGCCソースからのさまざまなアーキテクチャ用のコンパイラGCC(および場合によってはclang)は、a)無料で、b)すべてのターゲットをサポートできる唯一のコンパイラです。クロスコンパイラの構築は簡単ではありませんが、実行可能でなければなりません。いくつかの参照:

「CMakeを使用してください!」という答えすべてのシステム上でソースのビルドをネイティブにサポートできるビルドシステムを使用することを奨励しているという点で、良いアドバイスを与えていますが、実際にはbuild Windows 7では、CMakeを使用しても効果はありません。

0
clemej

Windows 10を使用すると、 CLion IDEおよび WSL を使用すると、これは実際に簡単です。Linuxを使用してWSLインストールを使用してコードをコンパイルできます。 GCCホストでの作業中のコンパイラツールチェーン(通常はWindows)。その後、もちろんWindowsのようなMinGWツールチェーンに切り替えるか、MSVCVisual Studioを使用して再度コンパイルしてWindowsバイナリを取得することもできます。

一日の終わりに、これは両方のバイナリを提供しますが、Windowsのみを常に使用しているように感じます。 WSLは、近年Microsoftが行った最高のことの1つであると言う人もいます。確かに、クロスプラットフォームのC/C++開発には素晴らしいです。

OS Xのコンパイルはこれに含まれていないため、残念ながらMacまたはOS Xを実行している仮想マシンが必要です。

0
BullyWiiPlaza