代码之家  ›  专栏  ›  技术社区  ›  MakotoE

包含在子项目中

  •  0
  • MakotoE  · 技术社区  · 6 年前

    我把projectB作为projectA的子项目。两个项目都包含用于存储头库的include目录。文件夹结构如下:

    projectA/CMakeLists.txt
    projectA/A.cpp
    projectA/include/projectB/CMakeLists.txt
    projectA/include/projectB/B.h
    projectA/include/projectB/include/boost
    projectA/include/projectB/include/...
    

    内部 出生体重 ,我正在使用Boost,因此include行如下所示:

    #include <boost/algorithm/string.hpp>
    

    A.cpp公司 ,我包括B.h。

    #include <B.h>
    

    projectA/CMakeLists.txt文件 ,我包括projectB和它的所有内容,如下所示:

    include_directories(
        include/projectB
        include/projectB/include/boost 
        include/projectB/include/...)
    

    如果我没有包含projectB使用的所有库目录,我就无法编译,因为编译器找不到boost。(我得到一个错误,上面写着: boost/algorithm/string.hpp: No such file or directory )

    是否有一个更简单的过程让project a导入所有来自projectB的内容并更改路径以反映此项目层次结构?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Torbjörn    6 年前

    对于现代CMake(即3.x),不建议再使用 include_directories . 另一种方法是用适当的“可见性”定义每个目标的include目录。

    假设, projectA 是在中定义的静态或共享库 projectA/CMakeLists.txt 如下所示 projectA_SOURCES 是该库的所有源文件(即不是头文件)的列表。

    add_library(projectA ${projectA_SOURCES})
    target_include_directories(projectA
        PUBLIC ${CMAKE_CURRENT_LIST_DIR}/include/projectB/include
               ${CMAKE_CURRENT_LIST_DIR}/include/projectB/include/boost
        PRIVATE ${CMAKE_CURRENT_LIST_DIR}/include/projectB)
    

    然后,在 projectB/CMakeLists.txt 有目标后 projectB 正在定义(作为库或可执行文件,这无关紧要):

    target_include_directories(projectB
        PUBLIC ${CMAKE_CURRENT_LIST_DIR}/include/projectA/include
        PRIVATE ${CMAKE_CURRENT_LIST_DIR}/include/projectA)
    target_link_library(projectB
        PUBLIC projectA)