85

C++ プロジェクトの私のコードは次のように編成されています

  • クラスを含むファイルがいくつか.cppあります.h
  • ファイルといくつかの外部ライブラリ.cxxに対してコンパイルする必要があるいくつかのファイルがあります。.cpp

ここで、各.cxxファイルにはmain()メソッドがあるため、ファイルと同じ名前を持つこれらのファイルごとに異なる実行可能ファイルを追加する必要があります。

また、これらの.cxxファイルは同じ外部ライブラリにリンクされない場合があります。

このビルドを CMake で書きたいのですが、私は一種の初心者ですが、どうすればよいですか?

4

3 に答える 3

122

私の提案は、これに 2 つのフェーズで取り組むことです。

  1. .cppを使用して、.hファイルからライブラリを構築します。add_library
  2. と を使用して、すべてのファイルを反復処理し.cxx、それぞれから実行可能ファイルを作成します。add_executableforeach

ライブラリを構築する

これは、次のような単純なものである可能性があります

file( GLOB LIB_SOURCES lib/*.cpp )
file( GLOB LIB_HEADERS lib/*.h )
add_library( YourLib ${LIB_SOURCES} ${LIB_HEADERS} )

すべての実行可能ファイルをビルドします

すべての .cpp ファイルをループして、個別の実行可能ファイルを作成するだけです。

# If necessary, use the RELATIVE flag, otherwise each source file may be listed 
# with full pathname. RELATIVE may makes it easier to extract an executable name
# automatically.
# file( GLOB APP_SOURCES RELATIVE app/*.cxx )
file( GLOB APP_SOURCES app/*.cxx )
foreach( testsourcefile ${APP_SOURCES} )
    # I used a simple string replace, to cut off .cpp.
    string( REPLACE ".cpp" "" testname ${testsourcefile} )
    add_executable( ${testname} ${testsourcefile} )
    # Make sure YourLib is linked to each app
    target_link_libraries( ${testname} YourLib )
endforeach( testsourcefile ${APP_SOURCES} )

いくつかの警告:

  • file( GLOB )新しいファイルが追加された場合、CMake は自動的に再構築しないため、通常はお勧めしません。ソースファイルがわからないので、ここで使用しました。
  • 場合によっては、ソース ファイルがフル パス名で見つかることがあります。必要に応じて、RELATIVE フラグをfind( GLOB ... )使用します。
  • ソース ファイルを手動で設定するには、再構築をトリガーする CMakeLists.txt を変更する必要があります。グロビングの(欠点)利点については、この質問を参照してください。
  • を使用してテスト名を生成しましたstring( REPLACE ... )フラグでget_filename_componentを使用することもできましたNAME_WE

「一般的な」CMake 情報に関しては、stackoverflow で既にここで尋ねられた幅広い「CMake の概要」の質問のいくつかを読むことをお勧めします。例えば:

于 2013-01-13T19:45:41.040 に答える