3

Boost.Build を使用してビルドされた C++ プロジェクトがあります。プロジェクトは 3 つのサブプロジェクトで構成されています。

    . [根]
    \ -  ソース
        \ -  一般
            \-- 構成
                \-- config.cpp
        \-- project_1
            \-- Jamfile.jam
        \-- project_2
            \-- Jamfile.jam
        \-- project_3
            \-- Jamfile.jam
    \-- Jamroot.jam

Jamroot.jam:

    プロジェクト my_project
        : 要件
          マルチ
          デバッグ:デバッグ
        : デフォルトビルド
          静的
        : ビルドディレクトリ ビン
        ;

    エイリアス project_1 : source/project_1 ;
    エイリアス project_2 : source/project_2 ;
    エイリアス project_3 : source/project_3 ;

    インストール ディストリビューション: project_1 project_2 project_3
        :EXE上
        ;

各プロジェクトには、次のテンプレートに従って Jamfile.jam があります。

    プロジェクト project_N
      : 要件
          CONFIG_DEFINE_1=
          CONFIG_DEFINE_2=
      ;

    lib config : [グロブ ../common/config/*.cpp] ;

    exe project_N
        : [グロブ *.cpp] 構成
        :  
        ;

config.cppは定義CONFIG_DEFINE_1CONFIG_DEFINE_2条件付きコンパイルを使用するため (実際には単に定数です)、configプロジェクトごとに個別のバージョンのライブラリがあります。

問題は、このようなアプローチconfigでは、ファイルが変更されたかどうかに関係なく、プロジェクト全体がビルドされるたびにライブラリが再ビルドされることです。つまり、最初にすべてをコンパイルしてリンクしてビルドし、2 回目には何も変更せずにビルドします。configそれぞれのライブラリのみがビルドされますproject_N。冗長なコンパイルが発生しないように、建物を適切にセットアップするにはどうすればよいですか?

4

1 に答える 1

1

私が理解しているように、構成ライブラリはさまざまなプロジェクトで共有されており、プロジェクトごとに異なる定義を使用しています。

その場合、ブースト ビルドやその他のビルド システムに関係なく、再コンパイルを克服することはできません。cpp ファイルのコンパイルの間に、前処理されたファイル変更されました。

再コンパイルを避けたい場合、1 つのオプションは構成ライブラリをプロジェクトごとに異なるライブラリに分割することconfigです。

私が考えることができる他の唯一のオプションは、毎回再コンパイルする必要があるコードの量を減らすことです。

たとえば、ソースファイルがありLargeFunction.cppます

 #if CONFIG_DEFINE_1
     void VeryLargeFunction() {
        ...
     }
 #elif CONFIG_DEFINE_2
     void VeryLargeFunction() {
        ...
     }
 #endif

これを 3 つのファイルに分割します。1 つは DEFINE_1 に定義された VeryLargeFunction を含み、もう 1 つは DEFINE_2 に定義され、もう 1 つは定義の値に基づいてこれら 2 つを単純に含みます。

 #if CONFIG_DEFINE_1
    #include "definitionFileFor1"
 #elif CONFIG_DEFINE_2
    #include "definitionFileFor2"
 #endif

このファイルは毎回再コンパイルする必要がありますが、「実際の」コードを含むオブジェクト ファイルは必要ありません。

コンパイルごとに既存のオブジェクト ファイルのみを効果的に再リンクし、すべてを iso 再コンパイルします。

ただし、欠点はメンテナンスが多く、さまざまな関数定義がさまざまなファイルに存在するため、コードが少し読みにくくなります。

于 2009-09-09T11:58:09.897 に答える