框架管理库
Framework manage libraries
我有一个依赖于多个第三方库的框架。我想轻松地分享我的框架。例如,用户只需要我的包含和添加我的库来使用我的框架,而不是所有的依赖项。
我使用 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位于test/:
cmake_minimum_required (VERSION 2.8.11)
project (C CXX)
include(CheckCXXCompilerFlag)
add_subdirectory("libA")
add_subdirectory("libB")
add_subdirectory("test")
主要内容CMakeLists.txt位于test/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位于test/test:
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 一切正常,则独立生成良好。
但是如果我只想通过进入 test/test 和 运行ning "cmake . && make" 创建 exe,我有一个未定义的对 addL(int,诠释)。为了让它工作,我必须在 CMakeLists 的末尾添加 target_link_libraries(C A) 。正常吗?是否可以仅添加主库而不添加其依赖项?
命令调用
target_link_libraries(C B)
在您的用例中有不同的含义。
在 "all" 用例 'B' 中(之前)定义为 CMake target,因此 CMake 知道库的位置(link_directories
在这种情况下不使用),并自动将库 'B' 的所有依赖项传播到可执行文件 'C'.
在 "test-only" 用例中没有名为 'B' 的 CMake 目标,因此它只是转换为 linker 选项 -lB
。链接器在 link 目录下搜索适当的库文件(在这种情况下需要 link_directories
)。但是有关 'B' 依赖项的信息丢失了,因此不会执行与 A 的自动 linking。
您的项目可能会提供一个 独立 CMake 脚本,您的库的用户可以将其包含在内。 脚本应该定义所有需要的依赖项。此类脚本的常见 "types" 是 FindXXX.cmake
和 XXXConfig.cmake
,可以通过 find_package(XXX) 命令包含它们。
我有一个依赖于多个第三方库的框架。我想轻松地分享我的框架。例如,用户只需要我的包含和添加我的库来使用我的框架,而不是所有的依赖项。
我使用 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位于test/:
cmake_minimum_required (VERSION 2.8.11)
project (C CXX)
include(CheckCXXCompilerFlag)
add_subdirectory("libA")
add_subdirectory("libB")
add_subdirectory("test")
主要内容CMakeLists.txt位于test/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位于test/test:
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 一切正常,则独立生成良好。 但是如果我只想通过进入 test/test 和 运行ning "cmake . && make" 创建 exe,我有一个未定义的对 addL(int,诠释)。为了让它工作,我必须在 CMakeLists 的末尾添加 target_link_libraries(C A) 。正常吗?是否可以仅添加主库而不添加其依赖项?
命令调用
target_link_libraries(C B)
在您的用例中有不同的含义。
在 "all" 用例 'B' 中(之前)定义为 CMake target,因此 CMake 知道库的位置(link_directories
在这种情况下不使用),并自动将库 'B' 的所有依赖项传播到可执行文件 'C'.
在 "test-only" 用例中没有名为 'B' 的 CMake 目标,因此它只是转换为 linker 选项 -lB
。链接器在 link 目录下搜索适当的库文件(在这种情况下需要 link_directories
)。但是有关 'B' 依赖项的信息丢失了,因此不会执行与 A 的自动 linking。
您的项目可能会提供一个 独立 CMake 脚本,您的库的用户可以将其包含在内。 脚本应该定义所有需要的依赖项。此类脚本的常见 "types" 是 FindXXX.cmake
和 XXXConfig.cmake
,可以通过 find_package(XXX) 命令包含它们。