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