CMake如何在没有源代码的情况下包含头文件?

问题描述:

这可能是一个虚拟的问题,但我从字面上看谷歌的两个第一页没有成功。
我正在写头文件库,而且我无法正确设置CMake配置,以便在构建解决方案时给出main.cpp找到合适的包含。
这怎么能完成?CMake如何在没有源代码的情况下包含头文件?

编辑

所以我也许应该给一点更详细的解释。
可以说我有一个./src文件夹:./src/core./src/wrappers。每个文件夹里我必须要包含在main.cpp文件.h文件需要:

#include <src/core/reader.h> 

不过,当我把在CMakeList.txt类似:

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

我收到这样的消息:src/core/reader.h没有这样的文件或目录。

只需添加一个include_directories()指令,即可找到目标项目只能找到标题头库的位置。


根据您的编辑。为了找到

#include <src/core/reader.h> 

您需要添加

include_directories(/full_parent_path_of_src) 

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

为了能够使用该路径,您应该参考src的父目录。
假设顶层CMakeLists.txt是在src相同的水平,则可以改为使用:

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后放,否则目标是不可见的。

+0

@Jairo好吧,随时投票或接受答案,如果它的作品。 ;-) – skypjack

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

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

然后使用它:

target_link_libraries(mytarget headerlib) 

这有一个好处,如果你想在多个目标中使用它,这很容易。