如何在没有来源的情况下包含标题?

时间:2016-10-24 17:13:51

标签: c++ cmake header-files

这可能是一个虚假的问题,但我确实看了谷歌的两个第一页没有成功 我正在编写一个仅限标题的库,我无法正确设置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没有此类文件或目录。

4 个答案:

答案 0 :(得分:5)

为了能够使用该路径,您应该参考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之后,否则目标不可见。

答案 1 :(得分:1)

只需添加include_directories()指令,即可找到目标项目可以找到仅限标题库的位置。

根据你的编辑。要找到

IDictionary<B,List<A>> output = input
    .GroupBy(pair => pair.Value)
    .ToDictionary(g => g.Key, g => g.Select(p.Key).ToList());

您需要添加

 #include <src/core/reader.h>

答案 2 :(得分:0)

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

答案 3 :(得分:0)

在某些情况下可能有意义的另一个选项是为仅标题库创建专用目标:

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

然后使用它:

target_link_libraries(mytarget headerlib)

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