CMake编译C++项目提示找不到头文件,现有配置该如何修正?
问题原因与解决方案
1 CMake指令使用错误
你混淆了include_directories和target_include_directories的语法规则:
include_directories是全局头文件搜索路径设置指令,不需要传入目标名、作用域参数(PUBLIC/PRIVATE等),你写的include_directories(search PUBLIC include)实际是把search、PUBLIC、include三个无效/错误路径加入了全局搜索列表,完全没有达到你要给search目标添加include目录的效果。- 针对单个目标设置头文件搜索路径应该使用现代CMake推荐的
target_include_directories指令,正确语法为target_include_directories(目标名 作用域 路径),对应你的场景就是target_include_directories(search PUBLIC include)。
2 头文件引入路径与搜索路径不匹配
你设置的头文件搜索路径是项目根目录下的include文件夹,编译器会直接在该目录下检索你写的头文件路径:
- 你代码中写的
#include "include/utilities.hpp"会让编译器去include/include/utilities.hpp路径下找文件,该路径不存在,所以触发找不到头文件的报错。
可选修正方案(二选一即可)
方案A:修改代码中的头文件引入写法
把所有#include "include/utilities.hpp"改为#include "utilities.hpp",配合如下修正后的CMakeLists.txt:
cmake_minimum_required(VERSION 3.16.3) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) project(search VERSION 1.0.0) add_executable( search source/utilities.cpp source/main.cpp include/utilities.hpp ) target_include_directories(search PUBLIC include)
方案B:修改CMake中的头文件搜索路径
不改动现有代码的引入写法,将头文件搜索路径设置为项目根目录,修正后的CMakeLists.txt对应配置:
cmake_minimum_required(VERSION 3.16.3) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) project(search VERSION 1.0.0) add_executable( search source/utilities.cpp source/main.cpp include/utilities.hpp ) target_include_directories(search PUBLIC ${PROJECT_SOURCE_DIR})
注意事项
修改完成后需要删除原有构建目录下的所有缓存文件,重新执行cmake和make命令,避免旧缓存导致错误复现。
内容的提问来源于stack exchange,提问作者0sharp
相关产品推荐
相关产品推荐

