GCC的学习(四)头文件搜寻顺序及环境变量

一、我对尖括号和双引号的理解

#include <iostream>
#include "myhearder.h"

我认为其实两种方式区别不大,但是尖括号其优点:

  • 区分用户和三方或标准系统的头文件
  • 对搜索顺序进行了优化

二、GCC对搜寻顺序的解释

默认情况下,预处理器首先搜寻双引号指示的头文件,然后是在标准系统目录的预配置列表中。举个例子,如果/usr/include/sys/stat.h中包含语句#include "types.h",那么GCC将先在/usr/include/sys中查找types.h,之后按照其一般路径。

对于尖括号形式的#include<file>,预处理器默认行为是仅在标准系统目录中查找。额外附加搜索目录列表取决于目标系统是如何配置、何处安装的。你的CPP版本对应的默认搜索路径列表可通过调用-v选项找到,如:

cpp -v /dev/null -o /dev/null

您可以使用许多命令行选项将其他目录添加到搜索路径。最常用的选项是-Idir,其使得dir目录在当前目录之后系统标准目录前搜索(双引号形式)。当然,你可以在命令行指定多个-I选项,此时,搜索顺序是从左往右顺序搜索。

如果你需要单独控制尖括号和双引号搜索路径进行控制,则可以使用选项-iquote/-isystem选项代替-I。对于这些不常见的选项详细说明,请查看调用

如果你指定了类似-I选项的其他选项,这将会影响预处理器搜寻器头文件,-v选项可以帮助你查看预处理器实际使用的搜寻路径。

请注意,您还可以使用-nostdinc选项来阻止预处理器搜索任何默认标准头文件目录。当你需要编译操作系统内核或其他不需要使用标准C库工具及程序时,此功能是很有用的。

三、GCC环境变量

请注意,你还可以指定搜索地点通过诸如-B -I -L,这些指定将会先于GCC环境变量,环境变量又会先于GCC配置变量[2]。

  • LD_LIBRARY_PATH 是一个环境变量目录,告知DLL加载器在程序启动时应该如何搜寻动态库。这个变量是危险且不推荐使用的;
  • LIBRARY_PATH当进行可以执行文件或库编译器时,告知连接器如何查找库文件;
  • INCLUDE_PATH 告知如何找到在#include语句中引用的文件

在任何情况下,LIBRARY_PATHINCLUDE_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'
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值