这可能是一个虚假的问题,但我确实看了谷歌的两个第一页没有成功
我正在编写一个仅限标题的库,我无法正确设置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
没有此类文件或目录。
答案 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)
这样做的好处是,如果您想在多个目标中使用它,那么这很容易实现。