头文件找不到的主因是#include写法错误:自定义头文件应用#include "xxx.h",标准库用#include ;编译器搜索路径不同,双引号先查当前目录,尖括号跳过当前目录直查系统路径。

头文件找不到?先看 #include 写法对不对
绝大多数“找不到头文件”的问题,其实出在 #include 语法本身。C++ 区分两种写法:#include "xxx.h" 和 #include <xxx.h></xxx.h>,它们的搜索路径顺序完全不同。
用双引号时,编译器**先查当前源文件所在目录**,再查系统路径;用尖括号时,**直接跳过当前目录,只查系统/配置的包含路径**。如果你自己写的 utils.h 放在和 main.cpp 同级,却写了 #include <utils.h></utils.h>,那就必然报错 fatal error: utils.h: No such file or directory。
- 自己项目里的头文件,统一用
#include "xxx.h" - 标准库或第三方库(如
<vector></vector>、<boost></boost>),用#include <xxx></xxx> - 不要混用:比如
#include "vector"在某些编译器下可能“碰巧”通过,但不跨平台,也不符合约定
g++ / clang 怎么加自定义头文件路径
当头文件不在当前目录,又不想用相对路径硬写进 #include(比如 #include "../../inc/common.h"),就得靠编译器参数告诉它去哪找。
关键参数是 -I(大写的 i),后面跟路径。它会让编译器把该路径加入 #include <...></...> 和 #include "..." 的搜索队列前端。
立即学习“C++免费学习笔记(深入)”;
- 多个路径就写多个
-I,顺序重要:前面的路径优先级更高 - 路径可以是绝对路径(
-I/home/user/project/include)或相对路径(-I../include) - 注意:Windows 下 MinGW 或 MSVC 不认
-I,MSVC 要用/I,Clang on Windows 两者都支持,但建议统一用-I避免混淆 - 示例命令:
g++ -I./include -I/usr/local/include/mylib main.cpp
CMake 里怎么正确设置 include_directories
用 CMake 管理项目时,别在每个 add_executable 前手动塞 include_directories(...) —— 它作用域是全局的,容易污染其他 target,而且从 CMake 3.10+ 就被标记为 legacy。
真正推荐的方式是用 target_include_directories,按 target 精确控制头文件可见范围。
- 只让某个可执行文件看到头文件:
target_include_directories(myapp PRIVATE ./inc) - 让库的使用者也能用它的头文件(比如安装后别人
#include <mylib></mylib>):target_include_directories(mylib INTERFACE $<include>)</include> -
PRIVATE表示只编译本 target 时生效;PUBLIC表示本 target 及其依赖者都能用;INTERFACE表示只给依赖者用 - 别漏掉
$<...></...>
-
<string></string>








