c++ - CMake target_include_directories 找不到私有(private) header 的#include

标签 c++ cmake

我正在尝试使用以下目录结构构建一个库:

lib1
|-include
| |-lib1
|   |-public.h
|-src
| |-private.h
| |-private.cpp
| |-public.cpp
|-lib
| |-liblib1.a
|-CMakeLists.txt

公共(public) header 是否包含私有(private) header 以使用其功能。

我的 CMakeLists.txt如下所示:
project(math)

set(SRC_FILES src/private.cpp src/public.cpp)

add_library(${PROJECT_NAME} STATIC ${SRC_FILES})

target_include_directories(
    ${PROJECT_NAME}
    PUBLIC
        "${CMAKE_CURRENT_SOURCE_DIR}/include"
    PRIVATE
        "${CMAKE_CURRENT_SOURCE_DIR}/src"
)

set_target_properties(
    ${PROJECT_NAME}
    PROPERTIES 
    ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/lib"
)

但是当我尝试构建库时,我收到了来自 public.h 的错误。说没有文件private.h
谷歌搜索时,我发现很旧的帖子不使用 target_include_directories或者它们通过将所有文件放在同一目录中来支持不干净的结构

最佳答案

如果包含标题,则必须说明该标题的位置。如果您说 header 是私有(private)的,那么您并没有告诉 header 对于依赖项的位置。当依赖项通过公共(public)的包含私有(private) header 时,他们不知道它在哪里。

解决方案:将公共(public) header 包含的所有 header 设为公开。或者换一种说法:不要在公共(public)标题中包含私有(private)标题。

关于c++ - CMake target_include_directories 找不到私有(private) header 的#include,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61632771/

相关文章:

static - 是否可以让 CMake 同时构建静态库和共享库?

c++ - 错误 : ‘int pow(double, int)’ conflicts with a previous declaration int pow(double a, int n) {

c++ - 为什么需要复制构造函数?在什么情况下它们非常有用?

c++ - 如何为 std::array 中的 std::vectors 保留内存?

c++ - 使用 MinGW 4.9.2 构建 glew 2.0.0 时出现 Cmake 错误

c++ - 如何在 cmake 中使用 SDL2 和 SDL_image

c++ - WinHTTP 错误 URL 无效

c++ - PrintWindow函数在notepad.exe中出错

c++ - 将 TagLib 链接到 Qt 时出错

c++ - CMake 与 Poky 交叉编译