c++ - 框架管理库

标签 c++ ubuntu cmake 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 以使项目正常运行。

位于test/的主要CMakeLists.txt的内容:

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

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

位于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)

位于test/test的主要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 一切正常,则独立生成良好。 但是如果我只想通过进入 test/test 并运行“cmake . && make”来创建 exe,我有一个对 addL(int, int) 的 undefined reference 。为了让它工作,我必须在 CMakeLists 的末尾添加 target_link_libraries(C A)。正常吗?是否可以仅添加主库而不添加其依赖项?

最佳答案

命令调用

target_link_libraries(C B)

在您的用例中具有不同的含义

在“所有”用例中,“B”(之前)定义为 CMake 目标,因此 CMake 知道库的位置(link_directories 未在这种情况下),并自动将库“B”的所有依赖项传播到可执行文件“C”。

在“仅测试”用例中,没有名为“B”的 CMake 目标,因此它只是转换为链接器选项 -lB。链接器在链接目录下搜索适当的库文件(在这种情况下需要 link_directories)。但是有关“B”依赖项的信息丢失了,因此不会执行与 A 的自动链接。


您的项目可能会提供一个独立 CMake 脚本,您的库的用户可以将其包含在内。 脚本应定义所有需要的依赖项。此类脚本的常见“类型”是 FindXXX.cmakeXXXConfig.cmake,可以通过 find_package(XXX) 包含它们。命令。

关于c++ - 框架管理库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45879603/

相关文章:

c++ - 如何在 boost::beast 上保持 websocket?

c++ - * 1233 >> 12 在这个计算十进制数字的代码中背后的数学是什么

c++ - C++ 中的抽象类帮助

linux - 我在哪里可以获得 xdg 菜单层次结构

c++ - 生成器表达式 cmake : copying works in debug but not release mode

c++ - 在 C++ 中从主机名获取计算机名?

java - 无法访问\\$wsl WSL - Intellij IDEA 无法访问 JDK

ubuntu - Docker 运行容器并修改环境设置

c++ - 带有示例的休息床静态库

c++ - 为什么我们在建库的时候要设置符号链接(symbolic link)呢?