在 Linux 下用 C++ 编译时“找不到头文件”(如 fatal error: xxx.h: No such file or directory)是非常常见的问题。原因和解决办法可以按下面几类来排查。
例如:
#include <opencv2/opencv.hpp>
报错:
fatal error: opencv2/opencv.hpp: No such file or directory
说明 开发包没装。
✅ 解决(以 Ubuntu 为例):
sudo apt install libopencv-dev
常见开发包命名规则:
libxxx-dev(C/C++ 库)-devel(CentOS / Fedora)比如你自己写的头文件:
#include "mylib.h"
但 mylib.h 在 ./include/ 目录。
✅ 解决:用 -I 指定路径
g++ main.cpp -I./include
多个路径:
g++ main.cpp -I./include -I/usr/local/include
GCC 默认搜索:
/usr/include
/usr/local/include
查看默认路径:
echo | g++ -E -Wp,-v -
例如:
/opt/mylib/include/xxx.h
✅ 编译时:
g++ main.cpp -I/opt/mylib/include -L/opt/mylib/lib -lmylib
例如:
#include <stdio.h> // OK
#include <cstdio> // C++
某些库只提供 C 接口:
extern "C" {
#include <some_lib.h>
}
add_executable(app main.cpp)
但没加:
include_directories(${PROJECT_SOURCE_DIR}/include)
✅ 正确:
include_directories(include)
或现代写法:
target_include_directories(app PRIVATE include)
arm-linux-gnueabihf-g++
但头文件是 x86 的。
✅ 必须用对应 sysroot:
--sysroot=/path/to/sysroot
有时受环境影响:
echo $C_INCLUDE_PATH
echo $CPLUS_INCLUDE_PATH
可临时设置:
export CPLUS_INCLUDE_PATH=/usr/local/include:$CPLUS_INCLUDE_PATH
-I?include_directories?如果你愿意,可以把 具体报错信息 + 编译命令 / CMakeLists.txt 发出来,我可以直接帮你定位是哪一步的问题。