1. ホーム
  2. c++

[解決済み] CMakeで複数の実行ファイルを追加する

2023-06-09 23:57:22

質問

C++プロジェクトにおける私のコードは、以下のように構成されています。

  • 私はいくつかの .cpp.h ファイルには、私のクラス
  • 私はいくつかの .cxx ファイルに対してコンパイルされなければなりません。 .cpp ファイルといくつかの外部ライブラリに対してコンパイルされます。

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

また、これらの .cxx ファイルは、同じ外部ライブラリにリンクされないかもしれません。

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

どのように解決するのですか?

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

  1. からのライブラリの構築 .cpp.h ファイルを使用し add_library
  2. すべての .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 ... ) .
  • 手動で source-files を設定するには CMakeLists.txt を変更する必要があり、これが再構築の引き金となります。以下を参照してください。 この質問 を参照してください。
  • を使用してテスト名を生成しました。 string( REPLACE ... ) . を使用することができました。 get_filename_component を使うことができます。 NAME_WE フラグで指定します。

CMake の一般的な情報に関しては、stackoverflow ですでに質問されている、広範な "CMake Overview" のいくつかを読むことをお勧めします。たとえば、次のようなものです。