web-dev-qa-db-ja.com

コードとツールの観点から、クロスプラットフォーム/マルチOS C ++プロジェクトはどのように計画されていますか?

Windows、Linux、Embedded Linuxで動作するプロジェクトをC++で作成したいと考えています。

多くのOSで作業する必要がある場合、プロジェクトはどのように作成されますか?最初に1つのOSで作成してから、コードをゆっくり変更して別のOSに移植しますか?例:私にとって、FirefoxのLinuxバージョンはWindowsプロジェクトと、コードベースが異なる別のLinuxプロジェクトとして作成されているように見えます。これは、Firefoxの動作がWindowsとLinuxで少し異なるためです。ソースコードのダウンロードは驚くほど単一のリンクですが。

QTがUI、スレッド化のブーストスレッド、CIのビルドボット、およびIDEのNetBeans/Eclipse/QTクリエーターに使用されている場合、プロジェクトを別のOSに移行するために必要なコードの書き換えを最小限に抑えることができますか?これは正しい方法ですか、またはそのようなプロジェクトは、2つの別個のOS用の2つの完全に別個のプロジェクトとして作成されることを意図していますか?

4
Nav

重要なのは、コードの移植できない部分をメインコードベースから分離することです。

たとえば、ディレクトリ構造にはshared/というディレクトリを含めることができます。このディレクトリには、portablesharedコードとコンテンツ。次に、移植性のないコードはすべて、動作をグループ化する特定のディレクトリに配置されます。たとえば、GUI/です。

実際のコードに関しては、複数の実装を行い、個別のプラットフォーム用の個別のソースファイル(例:GUI/Qt/Linux/<linux_specific_files>)を介して条件付きコンパイルを使用し、ビルドシステムを使用して、作成するビルドの種類を定義できます(たとえばQtまたはGTKを使用した一般的なLinuxビルド。もう1つの方法は、プリプロセッサディレクティブを使用して、コンパイル時にコードの一部を含めたり除外したりすることです。簡単な例は次のようになります:

#ifdef XX_LINUX_BUILD
    // Linux specific code here
#endif
#ifdef XX_WINDOWS_BUILD
    // Windows specific code here
#endif

...ここで、XXは、衝突を回避するためのプロジェクトの一意の識別子を示します。次に、コンパイル時に、必要なコンパイラコマンドライン引数を設定するビルドスクリプトを介してXX_LINUX_BUILDまたはXX_WINDOWS_BUILDを定義します(例:-DXX_LINUX_BUILD with GCC/g ++)。

3
zxcdw