私は複数のサードパーティライブラリに依存するフレームワークを持っています。私は簡単に私のフレームワークを共有したいと思います。たとえば、ユーザーは自分のインクルードのみを必要とし、自分のフレームワークを使用するために自分の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)を追加する必要があります。それは普通ですか?メインライブラリのみを依存関係なしで追加することは可能ですか?
スタンドアロンで静的なlibを正しく理解していれば、すべての依存関係をリンクする必要があります。スタンドアロンの共有ライブラリにリンクされているのに対し、私はメインライブラリが必要です。 – F4r3n
はい、静的*ライブラリの依存関係に明示的にリンクする必要があります。 * Shared *ライブラリはこれを必要としません。依存関係は自動的にロードされます。 – Tsyvarev