私の提案は、これに 2 つのフェーズで取り組むことです。
.cpp
を使用して、.h
ファイルからライブラリを構築します。add_library
- と を使用して、すべてのファイルを反復処理し
.cxx
、それぞれから実行可能ファイルを作成します。add_executable
foreach
ライブラリを構築する
これは、次のような単純なものである可能性があります
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 の概要」の質問のいくつかを読むことをお勧めします。例えば: