10

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

3 回答 3

12

你告诉 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_directories 和#include the file "../lib1/lib1.h"

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

于 2012-08-17T20:27:51.427 回答
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>
于 2012-08-19T18:40:50.847 回答
1

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

root
    CMakeLists.txt
    bin
    lib
    lib0
        CMakeLists.txt
        lib0.cpp
        lib0
            lib0.h
    lib1
        CMakeLists.txt
        lib1.cpp
        lib1
            lib1.h
    ...
于 2012-08-17T20:12:46.510 回答