2017-08-25 59 views
1

我有一個框架,這取決於多個第三方庫。我想輕鬆分享我的框架。例如,用戶只需要我的包含,並添加我的庫來使用我的框架,而不是所有的依賴關係。框架管理庫

我使用CMake來創建我的庫,但我仍然試圖瞭解它是如何工作的。

項目

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

的libB依賴於力霸的層次,我想只添加libB使項目工程。

位於測試/主要的CMakeLists.txt的含量:

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

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

位於測試的主要的CMakeLists.txt的含量/ LIBA

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}) 

的主要CMakeLists.txt的內容位於test/libB

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_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的一切工作正常,獨立很好地產生。 但是,如果我想通過進入測試/測試並運行「cmake。& & make」來創建唯一的exe,我有一個未定義的addL(int,int)引用。爲了使它工作,我必須在CMakeLists的末尾添加target_link_libraries(C A)。這是正常的嗎?是否有可能只添加沒有依賴關係的主庫?

回答

1

命令調用

target_link_libraries(C B) 

在您的使用情況不同的含義

在「所有」用例「B」是(預先)定義爲CMake的目標,所以CMake的知道該庫的位置(link_directories沒有在這種情況下使用的),並自動傳播庫的所有依賴'B'可執行'C'。

在「test-only」用例中,沒有名爲'B'的CMake目標,因此它只是轉換爲鏈接器選項-lB。鏈接器在鏈接目錄下搜索適當的庫文件(在這種情況下需要link_directories)。但關於'B'依賴關係的信息丟失了,所以不會執行與A的自動鏈接。


您的項目可以提供可通過您的圖書館的用戶包括一個獨立 CMake的腳本。 腳本應該定義所有需要的依賴項。這些腳本的常見「類型」是FindXXX.cmakeXXXConfig.cmake,可通過find_package(XXX)命令包含這些腳本。

+0

如果我理解正確,對於獨立的,與我的靜態lib我需要鏈接所有的依賴關係。而獨立鏈接到共享庫我只需要主lib。 – F4r3n

+0

是的,您需要明確鏈接到* static *庫的依賴關係。 * Shared *庫不需要這個:它的依賴被自動加載。 – Tsyvarev