CMake如何包含没有源文件的头文件

CMake how to include headers without sources?

本文关键字:文件 源文件 何包含 CMake      更新时间:2023-10-16

这可能是一个愚蠢的问题,但我确实看过谷歌的前两个页面,没有成功。
我正在编写一个头仅库,我无法正确设置CMake配置,以便当我构建给定main.cpp的解决方案时找到适当的包含。
如何做到这一点呢?

编辑

所以我可能应该给出更详细的解释。
假设我有一个./src文件夹,里面有:./src/core./src/wrappers。在每个文件夹中,我有.h文件,需要包含在main.cpp文件中:

#include <src/core/reader.h>

当我输入CMakeList.txt的时候:

include_directories(src/core)
add_executable(main main.cpp)

我收到这样的消息:src/core/reader.h no such file or directory.

为了能够使用该路径,您应该参考src的父目录。
假设顶级CMakeLists.txtsrc处于同一级别,您可以使用以下命令:

include_directories(${CMAKE_SOURCE_DIR})

根据CMAKE_SOURCE_DIR的文档:

到源代码树顶层的路径。

如果src直接在顶级目录中,这应该允许您使用如下内容:

#include <src/whatever/you/want.h>

也就是说,有几个建议:

  • 我宁愿添加这个:

    include_directories(${CMAKE_SOURCE_DIR}/src)
    

    用这个:

    #include <whatever/you/want.h>
    

    在你的路径和限制搜索区域不再有src

  • 我可能会使用target_include_directories而不是include_directories,并指定目标用于该规则:

    target_include_directories(main ${CMAKE_SOURCE_DIR}/src)
    

    必须放在add_executable之后,否则目标不可见。

在某些情况下可能有意义的另一种选择是为仅头文件库创建一个专用目标:

add_library(headerlib INTERFACE)
target_include_directories(headerlib INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})

然后使用它:

target_link_libraries(mytarget headerlib)

这样做的好处是,如果您想在多个目标中使用它,很容易做到。

只需添加一个include_directories()指令,以便找到目标项目可以找到的头库。


根据你的编辑。查找

 #include <src/core/reader.h>

你需要添加

 include_directories(/full_parent_path_of_src)

如果我正确理解您的问题,那么在您的CMakeLists.txt中,您需要为头库的每个目录添加include_directories(<DIRECTORY>)