2017-08-25 53 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