C++ 头文件中 <> 和 “” 的区别
#include <cstdio>
#include "hello.h"int main(){printf("hello world!");return 0;
}
● <cstdio> 这种形式表示不要在当前目录下进行搜索,只在系统目录里搜索;
 ● "hello.h" 这种形式则优先搜索当前目录下有没有这个文件,找不到再进行搜索系统目录;
 所以一般自己写的头就用 "" 来包,系统提供的头就用 <> 来包
需要注意的是,上面的程序中,当然也可以把
#inlucde <cstdio>用""来包,写成#include "cstdio",这样先会在当前目录下找一下有没有 cstdio,没有的话再到系统目录里找。但是存在一些风险,比如我就恰好在当前目录下就有一个 脏数据的 cstdio,那么程序编译就会出错了
还有个相对路径的例子
这个工程
 
外面的 CMakeLists.txt 长这样:
 
子工程 hellolib 里面的 CMakeList.txt 长这样:
 
hello.cpp 的代码长这样:
 
可以看到在 子工程里的 CMakeList.txt 中不用这么写:
add_library(hellolib STATIC hello.cpp hello.h)  // 不用写 hello.h
正是因为 #include "hello.h" 它会自动先在当前目录下找
还有个问题
按着上面的例子,来看
最开始的 main.cpp 长这样,头是这么包的 => #include "hellolib/hello.h"
 
之前的外面的 CMakeList.txt 是长这样的:

接下来魔法来了,我加一句 target_include_directories(a.out PUBLIC hellolib)

通过 target_include_directories 来指定要包的头文件的目录,这样用 target_include_directories 指定的路径会被视为与系统路径等价,这样就可以这么来包 hello.h 了
 
上面这样包完全没有问题,相当于会去系统路径下找 hello.h
当然也可以这么包,相当于会去 target_include_directories 指定的路径下去找 hello.h

当然也可以像最开始那样包 hello.h,也能够找到 hello.h
 
但是你需要清楚,三种方式的原理是不一样的