【问题标题】:CMake and dependenciesCMake 和依赖项
【发布时间】:2014-11-18 10:08:18
【问题描述】:

我有以下目录结构和库依赖:

./lib-a
./lib-b (depending on lib-a)

每个目录都包含一个CMakeLists.txt 文件,用于生成自己的库。 我正在使用外源构建策略。

为了说lib-b依赖于lib-a,我把命令add_subdirectory(../lib-a lib-a)放到了./lib-b/CMakeLists.txt里面,按照official CMake tutorial的教导。这样我就知道在./lib-b/build dir中创建了一个子目录lib-a

这不是我想要的行为。我想获得的是 CMake 在生成 lib-b 时引用 lib-a,如果尚未生成 lib-a,CMake 应该使用 CMakeLists.txt 在 ./lib-a/build 内部生成它lib-a(在处理依赖项时的行为类似于 make 工具)。

我还想补充一点,在我的示例中我没有使用根 CMakeLists.txt,但我想要的是 lib-b/CMakeLists.txt 声明对 lib-a 的依赖,从而使 lib -a 使用它自己的 lib-a/CMakeLists.txt 编译,如果还没有的话。

这是目录结构及其内容:

lib-a/
    CMakeLists.txt (for compiling lib-a)
    src/
        test.cpp
    include/
        test.hpp

lib-b/
   main.cpp
   CMakeLists.txt (for compiling lib-b; here is the point where I would like to make reference to lib-a, that I need for the generation of lib-b)

lib-b/main.cpp 还包含 test.hpplib-a 的包含,因为它使用了 lib-a 的功能。在lib-b/CMakeLists.txt的规范中应该考虑到这一点。

lib-a/CMakeLists.txtlib-b/CMakeLists.txt这两个文件的内容应该是什么?

【问题讨论】:

    标签: cmake build-dependencies


    【解决方案1】:

    我认为您误解了本教程。将库链接在一起的东西是target_link_library(lib_b lib_a)。如果依赖项的名称是作为构建一部分的库,CMake 将神奇地使依赖项工作。它与子目录无关。其实如果我有如下目录结构:

    ./
    ./a.hpp
    ./a.cpp
    ./b.hpp
    ./b.cpp
    ./CMakeLists.txt
    

    以下将设置依赖关系就好了:

    PROJECT(lib_a)
    ADD_LIBRARY(lib_a a.hpp a.cpp)
    PROJECT(lib_b)
    ADD_LIBRARY(lib_b b.hpp b.cpp)
    TARGET_LINK_LIBRARIES(lib_b lib_a)
    

    这也适用于子目录项目:

     ./
     ./CMakeLists.txt
     ./lib_a/CMakeLists.txt
     ./lib_a/a.hpp
     ./lib_a/a.cpp
     ./lib_b/CMakeLists.txt
     ./lib_b/b.hpp
     ./lib_b/b.cpp
    

    还有文件列表:

     # ./CMakeLists.txt
     CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
     ADD_SUBDIRECTORY(lib_a)
     ADD_SUBDIRECTORY(lib_b)
    
     # ./lib_a/CMakeLists.txt
     CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
     PROJECT(lib_a)
     ADD_LIBRARY(lib_a a.hpp a.cpp)
    
     # ./lib_b/CMakeLists.txt
     CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
     PROJECT(lib_b)
     INCLUDE_DIRECTORIES(${lib_a_SOURCE_DIR})
     ADD_LIBRARY(lib_b b.hpp b.cpp)
     TARGET_LINK_LIBRARIES(lib_b lib_a)
    

    【讨论】:

    • Tnx 为您的回答和使用 target_link_libraries 的建议,但您提供的示例不符合我的需要。实际上,您在同一个目录中拥有所有 .cpp 和 .h 文件,并且您正在根目录中的单个 CMakeLists.txt 中编写 deps。相反,我有两个目录,每个目录都有自己的 CMakeLists.txt,如原始帖子中所述。您能否通过指定我的案例的 lib-a/CMakeLists.txt 和 lib-b/CMakeLists.txt 的内容来更好地解释您提出的解决方案和 target_link_libraries 的使用如何适应我的案例?
    • @davide 它在子目录项目中也能正常工作。更新了答案以反映这一点。
    • Tnx,那么lib_a的包含文件呢?我是否应该在 lib_b/CMakeLists.txt 中明确包含指向 lib_a 包含文件目录的 target_include_directories 命令?
    • 我添加了天真的方式。通常,您可以使用${FOO_SOURCE_DIR} 获取项目 FOO 的源目录。有更好的方法可以在 b 的搜索路径中仅隔离公共标头。
    • 对不起,可能是我的评论不清楚。我的意思是:我是否需要在 lib_b/CMakeLists.txt 中明确指定对 lib_a 的引用的引用,或者假设这两个库被指示为相关(lib_b 对 lib_a 的依赖关系),lib_b/CMakeLists.txt 会自动生成引用 lib_a 的包含(lib_a 的包含目录在 lib_a/CMakeLists.txt 中指明...)?
    猜你喜欢
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多