CMake无法找到库头文件,如何配置实现直接引用库内头文件
CMake头文件引用问题排查与解决
问题根源是target_include_directories的作用域参数使用错误,INTERFACE作用域不会对库本身的编译生效。
作用域参数说明
CMake的target_include_directories有三类作用域配置,分别对应不同生效范围:
PRIVATE:配置仅作用于当前目标的编译过程,不会传递给依赖当前目标的其他目标INTERFACE:配置仅会传递给依赖当前目标的其他目标,当前目标自身编译时不会生效PUBLIC:同时包含PRIVATE和INTERFACE的作用,既对当前目标生效,也会传递给下游依赖
你当前给MyFunctions库配置的是INTERFACE类型的头文件目录,所以只有链接了MyFunctions的myexecutable能搜索到myLibrary/include目录,MyFunctions编译自身的myfunction.cpp时,不会把这个目录加入头文件搜索路径,所以必须写相对路径才能找到头文件。如果删除该配置,下游的myexecutable也拿不到头文件搜索路径,就会抛出你遇到的找不到mylibrary.h的报错。
修正方案
把myLibrary目录下的CMakeLists.txt中的配置修改为:
add_library(MyFunctions src/myfunction.cpp) target_include_directories(MyFunctions PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include")
修改后即可在myfunction.cpp中直接使用#include "mylibrary.h"引入头文件,同时myexecutable依然能正常搜索到该头文件。
补充最佳实践
如果你的库存在仅内部使用的头文件,放在库src目录下的话,可以额外添加PRIVATE的头文件目录配置,不会对外暴露,避免污染下游目标的头文件搜索路径:
target_include_directories(MyFunctions PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/src")
内容的提问来源于stack exchange,提问作者José Otero
相关产品推荐
相关产品推荐

