编译render_kinect项目遇头文件找不到错误求助
遇到这种明明头文件存在、CMake也配置了包含路径但编译还是报错的情况,大概率是CMake路径配置的细节出了问题,我给你几个排查和解决的方向:
确保include路径绑定到正确的编译目标
全局的include_directories有时候会因为指令顺序问题不生效——如果你的add_executable或者add_library写在include_directories之前,目标是不会继承这个路径的。更稳妥的方式是用target_include_directories明确指定给目标添加包含路径,比如在你的CMakeLists.txt里找到对应的编译目标(比如项目生成的可执行文件或库的名字),添加:target_include_directories(your_target_name PUBLIC ${PROJECT_SOURCE_DIR}/include)这样能保证这个路径被正确应用到目标的编译过程中。
核对头文件的实际路径结构
你用的是#include <render_kinect/kinectSimulator.h>,这要求你的include目录下必须有一个render_kinect子目录,里面才是kinectSimulator.h——也就是完整路径得是${PROJECT_SOURCE_DIR}/include/render_kinect/kinectSimulator.h。如果头文件是直接放在include根目录下的,那应该改成#include <kinectSimulator.h>,或者调整目录结构匹配你的include语句。验证CMake生成的编译命令
运行make VERBOSE=1查看实际的编译指令,检查里面有没有-I/home/sarkar/libs/render_kinect/include这个参数。如果没有,说明CMake的包含路径根本没生效:- 可以在CMakeLists.txt里加一句
message(STATUS "PROJECT_SOURCE_DIR: ${PROJECT_SOURCE_DIR}"),重新运行cmake,看看这个变量是不是指向你的项目根目录(也就是/home/sarkar/libs/render_kinect),如果不是,那得调整变量或者直接写绝对路径做测试。
- 可以在CMakeLists.txt里加一句
清理CMake缓存重新生成
旧的CMake缓存有时候会导致配置不更新,先删掉build目录里的所有文件:rm -rf build/*然后重新运行
cmake ..和make,试试能不能解决问题。临时测试#include写法
可以暂时把#include <render_kinect/kinectSimulator.h>改成#include "kinectSimulator.h"(用双引号),双引号会优先搜索当前源文件所在目录,再搜索指定的include路径,能帮你快速判断是不是路径配置的问题。不过这只是临时测试,最终还是要把CMake路径配置好,保持规范的写法。
内容的提问来源于stack exchange,提问作者krips89

