【问题标题】:Framework manage libraries框架管理库
【发布时间】:2018-02-03 09:33:03
【问题描述】:

我有一个依赖于多个第三方库的框架。我想轻松分享我的框架。例如,用户只需要我的包含和添加我的库来使用我的框架,而不是所有的依赖项。

我使用 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) 有一个未定义的引用。为了使它起作用,我必须在 CMakeLists 的末尾添加 target_link_libraries(CA)。正常吗?是否可以只添加主库而不添加其依赖项?

【问题讨论】:

    标签: c++ ubuntu cmake libraries


    【解决方案1】:

    命令调用

    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) 命令包含。

    【讨论】:

    • 如果我理解正确,对于独立的,我的静态库我需要链接所有依赖项。而独立链接到共享库我只需要主库。
    • 是的,您需要显式链接到 static 库的依赖项。 共享​​>库不需要这个:它的依赖是自动加载的。
    猜你喜欢
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    相关资源
    最近更新 更多