【问题标题】:CMake and handling subfolder header filesCMake 和处理子文件夹头文件
【发布时间】:2012-08-17 20:01:54
【问题描述】:

我正在尝试设置我的项目以构建几个包含其完整功能的动态库。每个库都有子文件夹。子文件夹库相互依赖,因此它们必须相互引用函数。我似乎已经设法让 CMake 在项目中正常运行,但是当我开始构建时,我的标题找不到彼此。似乎在构建时,包含路径设置不正确。我怎样才能解决这个问题?是否需要采取其他步骤才能正确设置包含路径?

结构看起来像这样

root
    CMakeLists.txt
    bin
    lib
    lib0
        CMakeLists.txt
        lib0.h
        lib0.cpp
    lib1
        CMakeLists.txt
        lib1.h
        lib1.cpp
    ...

在根目录的 CMakeLists.txt 中,我有这样的声明:

set(ROOT /blah/blah/root)    

include_directories(${ROOT}/lib0)
include_directories(${ROOT}/lib1)

add_subdirectory(lib0)
add_subdirectory(lib1)

在子文件夹的 CMakeLists.txt 中,我有:

set(lib0_SOURCES "")
list(APPEND lib0_SOURCES lib0.cpp)
add_library(lib0_lib ${lib0_SOURCES})

我的库标题看起来像(假设这是 lib0.h):

#include "lib1/lib1.h"
...

CMake 运行良好,没有错误,但是当我去编译时,我收到如下错误:

In file included from /blah/blah/root/lib0/lib0.cpp:1:0:
/blah/blah/root/lib0/lib0.h:1:30: fatal error: lib1/lib1.h: No such file or directory

【问题讨论】:

    标签: c++ cmake


    【解决方案1】:

    你告诉 GCC 给#include the file "lib1/lib1.h"。当你构建时,CMake 会要求在 "${ROOT}/lib0" 和 "${ROOT}/lib1" 中寻找额外的头文件

    所以,GCC 正在尝试 "${ROOT}/lib0/lib1/lib1.h" 和 "${ROOT}/lib1/lib1/lib1.h" 是的,不能工作。

    修复它:

    • 您可以在根 CMakeLists.txt 中使用:include_directories(".")
    • 保留你的 CMakeLists 但#include the file "lib1.h"
    • 删除 CMakeLists 和 #include the file "../lib1/lib1.h" 中的 include_directories

    IMO,我会选择第一个选项!

    【讨论】:

    • 是的,第一个选项是我解决它的方式。感谢您的澄清!
    【解决方案2】:

    我会要求 CMake 只考虑 C/C++ 的 ROOT 目录包括查找:

    set(ROOT /blah/blah/root)
    
    include_directories(${ROOT})
    
    add_subdirectory(lib0)
    add_subdirectory(lib1)
    

    然后,在 C/C++ 中,使用尖括号('')而不是双引号('"'):

    #include <lib1/lib1.h>
    

    【讨论】:

    • 为什么要使用 '' ?我认为它与双引号相同,但人们使用它们来包含系统标题。没有?
    • 双引号 (") 使预处理器首先在与当前(已解析)文件相同的目录中搜索。尖括号涉及更一般的搜索,在所有包含路径中给处理器(例如,通过 -I 指令)。另见 thisthis
    【解决方案3】:

    您需要使用双重命名方案或指定基目录作为包含路径:

    root
        CMakeLists.txt
        bin
        lib
        lib0
            CMakeLists.txt
            lib0.cpp
            lib0
                lib0.h
        lib1
            CMakeLists.txt
            lib1.cpp
            lib1
                lib1.h
        ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      • 2011-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多