#include
#include "myhearder.h"
我认为其实两种方式区别不大,但是尖括号其优点:
- 区分用户和三方或标准系统的头文件
- 对搜索顺序进行了优化
默认情况下,预处理器首先搜寻双引号指示的头文件,然后是在标准系统目录的预配置列表中。举个例子,如果/usr/include/sys/stat.h
中包含语句#include "types.h"
,那么GCC将先在/usr/include/sys
中查找types.h
,之后按照其一般路径。
对于尖括号形式的#include
,预处理器默认行为是仅在标准系统目录中查找。额外附加搜索目录列表取决于目标系统是如何配置、何处安装的。你的CPP版本对应的默认搜索路径列表可通过调用-v
选项找到,如:
cpp -v /dev/null -o /dev/null
您可以使用许多命令行选项将其他目录添加到搜索路径。最常用的选项是-Idir
,其使得dir
目录在当前目录之后系统标准目录前搜索(双引号形式)。当然,你可以在命令行指定多个-I
选项,此时,搜索顺序是从左往右顺序搜索。
如果你需要单独控制尖括号和双引号搜索路径进行控制,则可以使用选项-iquote
和/
或-isystem
选项代替-I
。对于这些不常见的选项详细说明,请查看调用。
如果你指定了类似-I
选项的其他选项,这将会影响预处理器搜寻器头文件,-v
选项可以帮助你查看预处理器实际使用的搜寻路径。
请注意,您还可以使用-nostdinc
选项来阻止预处理器搜索任何默认标准头文件目录。当你需要编译操作系统内核或其他不需要使用标准C库工具及程序时,此功能是很有用的。
请注意,你还可以指定搜索地点通过诸如-B
-I
-L
,这些指定将会先于GCC环境变量,环境变量又会先于GCC配置变量[2]。
LD_LIBRARY_PATH
是一个环境变量目录,告知DLL加载器在程序启动时应该如何搜寻动态库。这个变量是危险且不推荐使用的;LIBRARY_PATH
当进行可以执行文件或库编译器时,告知连接器如何查找库文件;INCLUDE_PATH
告知如何找到在#include
语句中引用的文件
在任何情况下,LIBRARY_PATH
和INCLUDE_PATH
都应该被设置在特定的编译系统中而不是bashrc
中,写在bashrc
中配置将会使得你的系统容易被感染。[3]简单来说,就是其他程序编译时也会收到你这个环境变量的影响,如SSH登陆时,bashrc会影响这次登陆的所有GCC编译。当然也取决你的具体需求,要是你想要永久生效当然写在bashrc
也是可以的。
[1] http://www.devdoc.net/c/cpp_7.2/Search-Path.html [2] https://gcc.gnu.org/onlinedocs/gccint/Driver.html#Driver [3] https://gcc.gnu.org/onlinedocs/cpp/Environment-Variables.html [4] https://blog.csdn.net/fengxinze/article/details/6940241?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control
附录:
Using built-in specs.
COLLECT_GCC=cpp
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 5.4.0-6ubuntu1~16.04.12' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12)
COLLECT_GCC_OPTIONS='-E' '-v' '-o' '/dev/null' '-mtune=generic' '-march=x86-64'
/usr/lib/gcc/x86_64-linux-gnu/5/cc1 -E -quiet -v -imultiarch x86_64-linux-gnu /dev/null -o /dev/null -mtune=generic -march=x86-64 -fstack-protector-strong -Wformat -Wformat-security
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/5/../../../../x86_64-linux-gnu/include"
#include "..." search starts here:
#include search starts here:
/usr/lib/gcc/x86_64-linux-gnu/5/include
/usr/local/include
/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed
/usr/include/x86_64-linux-gnu
/usr/include
End of search list.
COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-E' '-v' '-o' '/dev/null' '-mtune=generic' '-march=x86-64'