2017-08-25 12 views
1

私は複数のサードパーティライブラリに依存するフレームワークを持っています。私は簡単に私のフレームワークを共有したいと思います。たとえば、ユーザーは自分のインクルードのみを必要とし、自分のフレームワークを使用するために自分のlibを追加します。フレームワークはライブラリを管理します

私はCMakeを使って自分のライブラリを作成していますが、それがどのように動作するかを理解しようとしています。

プロジェクトの階層

test 
├── CMakeLists.txt 
├── libA 
│   ├── CMakeLists.txt 
│   ├── libA.cpp 
│   ├── libA.hpp 
├── libB 
│   ├── CMakeLists.txt 
│   ├── libB.cpp 
│   ├── libB.hpp 
└── test 
    ├── CMakeLists.txt 
    └── main.cpp 

libBはLIBAに依存し、私は、プロジェクトの作品を作るためにのみlibBを追加したいと思います。

試験/に位置するメインCMakeLists.txtの含有量:

cmake_minimum_required (VERSION 2.8.11) 
project (C CXX) 
include(CheckCXXCompilerFlag) 

add_subdirectory("libA") 
add_subdirectory("libB") 
add_subdirectory("test") 

テスト/ LIBAに位置するメインCMakeLists.txtの含有量:

cmake_minimum_required (VERSION 2.8.11) 
project (A CXX) 
include(CheckCXXCompilerFlag) 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++14") 
file(GLOB SOURCES "*.cpp") 
add_library(A STATIC ${SOURCES}) 

test/libBにあるメインCMakeLists.txtの内容

cmake_minimum_required (VERSION 2.8.11) 
project (B CXX) 
include(CheckCXXCompilerFlag) 

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++14") 
set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} "-static") 

include_directories("../libA") 
link_directories("../libA") 
file(GLOB SOURCES "*.cpp") 

add_library(B STATIC ${SOURCES}) 
target_link_libraries(B A) 

テスト/テストにあるメインCMakeLists.txtの内容:私はメインにCMakeを実行すると、すべてが正常に動作

cmake_minimum_required (VERSION 2.8.11) 
project (C CXX) 
include(CheckCXXCompilerFlag) 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++14") 

include_directories(../libA) 
include_directories(../libB) 

link_directories(../build/libB) 
link_directories(../build/libA) 

add_executable(C main.cpp) 

target_link_libraries(C B) 

、スタンドアロンがうまく生成されます。 しかし、テスト/テストに移動し、 "cmake。& & make"を実行して、exeだけを作成したい場合は、addL(int、int)への未定義の参照があります。それを動作させるには、CMakeListsの最後にtarget_link_libraries(C A)を追加する必要があります。それは普通ですか?メインライブラリのみを依存関係なしで追加することは可能ですか?

答えて

1

コマンド呼び出し

target_link_libraries(C B) 

はあなたのユースケースで異なる意味を持っています。 CMakeのライブラリの位置を知っている(link_directoriesがその場合に使用されていない)、および自動ライブラリのすべての依存関係を伝播するように、「全て」のユースケース「B」で

は(以前に)、CMakeの標的として定義されます'B'を実行可能ファイル 'C'に変更します。

"テスト専用"ユースケースでは、 'B'という名前のCMakeターゲットがないため、リンカオプション-lBに変換されます。 Linkerはリンクディレクトリの下にある適切なライブラリファイルを検索します(この場合はlink_directoriesが必要です)。しかし、 'B'依存関係に関する情報は失われるので、Aとの自動リンクは実行されません。


あなたのプロジェクトは、あなたのライブラリーのユーザーによって含めることができスタンドアロン CMakeのスクリプトを提供することができます。 スクリプトは、必要なすべての依存関係を定義する必要があります。そのようなスクリプトの一般的な「タイプ」はとXXXConfig.cmakeです。これはfind_package(XXX)コマンドで取り込むことができます。

+0

スタンドアロンで静的なlibを正しく理解していれば、すべての依存関係をリンクする必要があります。スタンドアロンの共有ライブラリにリンクされているのに対し、私はメインライブラリが必要です。 – F4r3n

+0

はい、静的*ライブラリの依存関係に明示的にリンクする必要があります。 * Shared *ライブラリはこれを必要としません。依存関係は自動的にロードされます。 – Tsyvarev

関連する問題