使用CMake包含静态库中的头文件

时间:2016-12-30 07:14:17

标签: 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看起来像这样:

富/的CMakeLists.txt:

cmake_minimum_required(VERSION 3.5.1)
project(FOO)

set(CMAKE_CXX_STANDARD 11)

add_subdirectory(lib)
add_subdirectory(src)

富/ LIB /的CMakeLists.txt:

add_subdirectory(libA)

富/ LIB / LIBA /的CMakeLists.txt:

add_library (staticLibA STATIC libA.cpp)

富/ 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为空

现在我试图将静态库中的标题包含到我的主项目中,如下所示:

富/ SRC / main.cpp中:

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

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

如果我尝试使用CMake构建它,则会生成libA,但我收到致命错误:

  

libA / libA.h:没有这样的文件或目录。

有谁知道我做错了什么?我需要create a ProjectConfig.cmake file吗?

1 个答案:

答案 0 :(得分:2)

您无需创建任何配置文件;这些是用于导入第三方项目。

由于您使用的是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}/..)

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

这就是你真正需要做的。但是,考虑到您正在使用的现代CMake,您应该将遗留关键字LINK_PUBLIC的使用替换为现代等效PUBLIC

另外,既然你提到.../srcDir*中的两个CMakeLists都是空的,为什么首先将它们放在那里?您可以轻松摆脱它们以及相关的add_subdirectory来电。