CMake和处理子文件夹头文件

时间:2012-08-17 20:01:55

标签: c++ cmake

我正在尝试设置我的项目来构建包含其完整功能的多个动态库。每个库都有子文件夹。子文件夹库彼此依赖,因此它们必须相互引用函数。我似乎已经设法让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

3 个答案:

答案 0 :(得分:7)

你告诉海湾合作委员会#include the file "lib1/lib1.h"。在构建时,CMake将要求在“$ {ROOT} / lib0”和“$ {ROOT} / lib1”

中查找额外的标题

所以,GCC正在尝试“$ {ROOT} /lib0/lib1/lib1.h”和“$ {ROOT} /lib1/lib1/lib1.h”Yup,无法工作。

修复它:

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

set(ROOT /blah/blah/root)

include_directories(${ROOT})

add_subdirectory(lib0)
add_subdirectory(lib1)

然后,在C / C ++中,使用角度braquets('<'和'>')而不是双引号('“'):

#include <lib1/lib1.h>