37

メイン アプリケーションの共有ライブラリとして構築している小さなコンポーネントがいくつかあります。libaとの例を使用してみましょうlibb。それぞれは、次のように独自のサブディレクトリ内に構築されます。

add_library(liba SHARED a.cpp)

次に、ルート プロジェクト フォルダーで、メイン アプリケーションを両方にリンクする必要があります。

include_directories(a)
include_directories(b)
add_executable(dummy dummy.cpp)
target_link_libraries(dummy a b)

CMake はこれで正常に動作し、アプリケーションはコンパイルされますが、リンクに失敗します。問題は、b が a を参照することです。リンク中にライブラリの順序を指定した場合

target_link_libraries(dummy b a)

プログラムは問題なくコンパイルおよびリンクされます

この種のシステムがライブラリのより複雑な相互依存関係を含むようになると、依存関係が非循環的であっても、それは不可能になり始めます。ここでリンク手順を管理するにはどうすればよいですか? CMakeでリンクするライブラリを注文するコツはありますか?

4

2 に答える 2

37

aとの関係を指定するにはb

target_link_libraries(b a)


ドキュメント から:

ライブラリの依存関係は、デフォルトでは推移的です。このターゲットが別のターゲットにリンクされている場合、このターゲットにリンクされているライブラリは、他のターゲットのリンク行にも表示されます。

したがって、この方法でaの依存関係として指定する場合は、に依存するターゲットをb明示的にリストする必要はありません。つまり、他のコマンドは次のようになります。ab

target_link_libraries(dummy b)

リストに害を及ぼすことはありませんがa

于 2012-08-30T20:28:33.653 に答える
17

簡単な解決策 (特に循環依存関係の場合) は、次のように、すべてのライブラリをリスト変数に入れてから、そのリストを 2 回 (必要に応じてそれ以上) 追加することです。

set(LINK_LIBS "liba libb libc")
target_link_libraries(app ${LINK_LIBS} ${LINK_LIBS})

(または、関数内でリストを 2 回続けて入力するだけtarget_link_librariesです)

これは私にとってはかなりの数回うまくいきましたが、私が気付いていない可能性のある欠点がいくつかあることを認めます (少しハックのように見えることを除いて)。

于 2012-08-30T20:37:29.207 に答える