c++ - 使用 CMake 包含来自静态库的头文件

标签 c++ cmake include static-libraries

我在使用静态库构建 CMake 项目时遇到问题。 我的项目结构如下所示:

Foo/
|-- CMakeLists.txt
|-- lib/
    |-- CMakeLists.txt
    |-- libA/
        |-- CMakeLists.txt
        |-- libA.cpp
        |-- libA.h
        |-- libAB.h
|-- src/
    |-- CMakeLists.txt
    |-- main.cpp
    |-- srcDirA/
        |-- CMakeLists.txt
        |-- srcA.h
    |-- srcDirB/
        |-- CMakeLists.txt
        |-- srcB.cpp
        |-- srcB.h

*/CMakeLists.txt 看起来像这样:

Foo/CMakeLists.txt:

cmake_minimum_required(VERSION 3.5.1)
project(FOO)

set(CMAKE_CXX_STANDARD 11)

add_subdirectory(lib)
add_subdirectory(src)

Foo/lib/CMakeLists.txt:

add_subdirectory(libA)

Foo/lib/libA/CMakeLists.txt:

add_library (staticLibA STATIC libA.cpp)

Foo/src/CMakeLists.txt:

add_subdirectory(srcDirA)
add_subdirectory(srcDirB)
include_directories(".")

add_executable(foo main.cpp)
target_link_libraries(foo LINK_PUBLIC libA)

Foo/src/srcDirA/CMakeLists.txt 是空的

Foo/src/srcDirB/CMakeLists.txt 是空的

现在我正尝试将静态库中的 header 包含到我的主项目中,如下所示:

Foo/src/main.cpp:

#include "srcDirB/srcB.h"
#include "libA/libA.h"  

int main() {
   //...
   return 0;
}

如果我尝试使用 CMake 构建它,则会生成 libA,但我会收到 fatal error :

libA/libA.h: No such file or directory.

有谁知道我做错了什么?我必须 create a ProjectConfig.cmake file

最佳答案

您不需要创建任何配置文件;这些用于导入第 3 方项目。

由于您使用的是 CMake >= 3.5.1,您可以轻松指定 usage requirements为您的图书馆。使用要求是诸如标志或包含目录之类的东西,客户需要使用库构建它们。

所以在 Foo/lib/libA/CMakeLists.txt: 中,你将这样做:

add_library (staticLibA STATIC libA.cpp)
target_include_directories(staticLibA INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/..)

或者,如果您希望相同的包含目录应用于 libA 本身(这很可能),请使用 PUBLIC 而不是 INTERFACE

这就是您真正需要做的。但是,鉴于您使用的是现代 CMake,您应该将旧关键字 LINK_PUBLIC 的使用替换为其现代等效 PUBLIC

另外,既然你提到 .../srcDir* 中的两个 CMakeLists 都是空的,为什么一开始就把它们放在那里?您可以轻松摆脱它们和相关的 add_subdirectory 调用。

关于c++ - 使用 CMake 包含来自静态库的头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41392243/

相关文章:

c++ - 参数包展开顺序

c++ - 使用 Cmake,如何防止库源包含在我的 IDE 中?

c++ - 如何在 cmake 工具链文件中获取项目根目录,这可能吗?

C 中包含 ljpeg 库时出现编译错误

c++ - 我们通常应该使用浮点字面量来代替更简单的 double 字面值吗?

c++ - 在 OpenGL 中撕裂?

c++ - 具有 unique_ptr 的类的复制构造函数

找不到 ODE 库的 Linux CMake 错误

php include 输出两个双引号

c++ - 当在其中定义全局变量时,如何在 .cpp 中包含 C 风格的 .h?