たとえば、c++ プロジェクトfoo
は cmake によって維持されます。1 つのライブラリlibfoo.a
(ソース ツリー全体で作成されたすべてのクラス/メソッド/関数を含む) を作成して、ライブラリにリンクできるプログラムを作成できるようにする必要があります-lfoo
。
さて、おもちゃの例を考えてみましょう。問題は明らかです。ディレクトリfoo
(プロジェクトのルート) にはディレクトリa
、およびが含まれますb
。次の 2 つCmakeLists.txt
が作成されます。
# a/CMakeLists.txt
add_library(A <a_sources>)
# b/CMakeLists.txt
add_library(B <b_sources>)
そしてCMakeLists.txt
、ルートディレクトリ用の 1 つ:
add_subdirectory(a)
add_subdirectory(b)
add_library(foo <foo_sources>
target_link_libraries(foo A B)
それは私にとって驚きでした: libfoo.a をビルドした後、 foo_sources からのメソッドのみが含まれ、a_sources
,b_sources
は除外されます。実行可能ファイルが同じプロジェクトでビルドされている場合は問題a
ありb
ませんfoo
。しかし、実行可能ファイルが「外部」プロジェクトで作成され、ライブラリを使用するfoo
必要がある場合は、リンクする必要があり-lfoo -la -lb
ます。多くのサブディレクトリを持つプロジェクトを想像してみてください。質問は、「プロジェクト全体から cmake を使用してメソッドを集約し、1 つのライブラリを作成する方法」です。
グーグルは、比較的最近埋め込まれた(2.8.8に登場した)OBJECT library
機会に私を導きました。それを使用する良い例がここに示されています。これで、上記の問題は次のように解決できます。
# a/CMakeLists.txt
add_library(A OBJECT <a_sources>)
# b/CMakeLists.txt
add_library(B OBJECT <b_sources>)
# foo/CMakeLists.txt
add_subdirectory(a)
add_subdirectory(b)
add_library(foo <foo_sources> $<TARGET_OBJECTS:A> $<TARGET_OBJECTS:B>)
問題は解決したようですが、残念ながら完全ではありません。
依存チェーンが 2 よりも長い場合、たとえば、 が にfoo
依存しA
、 が に依存しているB
場合、問題は依然として残ります。それは、
オブジェクト ライブラリには、オブジェクト ファイルにコンパイルするソース (およびヘッダー) のみを含めることができます。
と
オブジェクト ライブラリは、インポート、エクスポート、インストール、またはリンクできません。
(引用は同リンクより)
のいくつかの組み合わせを試しましtarget_link_library()
たが、add_library(), add_library(... OBJECT ..)
リンクA
を試みて成功B
しfoo
ませんでした(cmake-process中のエラー)
私は単純なものを失っているに違いありません、助けてください、ありがとう!それが重要かどうかはわかりません。プロジェクトはLinuxで維持されています。