C/C++ 头文件以及库的搜索路径
关键点: 1. #include <...> 不会搜索当前目录
2. 使用 -I 参数指定的头文件路径仅次于 搜索当前路径。
3. gcc -E -v 可以输出头文件路径搜索过程
C++编译时,教科书中写道:#include “headfile.h”优先在当前目录查找头文件;#include < headfile.h >从系统默认路径查找头文件。先前以为系统默认路径是环境变量$PATH指定的路径,在系统上一查,傻了眼:
-bash-3.2$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/X11R6/bin:/usr/java/j2re1.4.0/bin:/usr/atria/bin:/ccase/bin:/home/devcomp/bin
全是bin目录,$PATH是运行可执行文件时的搜索路径,与include头文件的搜索路径无关,可能不少人犯了我这样的错误。
头文件:
1. #include “headfile.h”
搜索顺序为:
①先搜索当前目录
②然后搜索-I指定的目录
③再搜索gcc的环境变量CPLUS_INCLUDE_PATH(C程序使用的是C_INCLUDE_PATH)
④最后搜索gcc的内定目录
/usr/include
/usr/local/include
/usr/lib/gcc/x86_64-redhat-linux/4.1.1/include
各目录存在相同文件时,先找到哪个使用哪个。
2. #include <headfile.h>
①先搜索-I指定的目录
②然后搜索gcc的环境变量CPLUS_INCLUDE_PATH
③最后搜索gcc的内定目录
/usr/include
/usr/local/include
/usr/lib/gcc/x86_64-redhat-linux/4.1.1/include
与上面的相同,各目录存在相同文件时,先找到哪个使用哪个。这里要注意,#include<>方式不会搜索当前目录!
这里要说下include的内定目录,它不是由$PATH环境变量指定的,而是由g++的配置prefix指定的(知道它在安装g++时可以指定,不知安装后如何修改的,可能是修改配置文件,需要时再研究下):
-bash-3.2$ g++ -v
Using built-in specs.
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-libgcj-multifile --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --enable-plugin --with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --with-cpu=generic --host=x86_64-redhat-linux
Thread model: posix
gcc version 4.1.2 20080704 (Red Hat 4.1.2-46)
在安装g++时,指定了prefix,那么内定搜索目录就是:
Prefix/include
Prefix/local/include
Prefix/lib/gcc/--host/--version/include
编译时可以通过-nostdinc++选项屏蔽对内定目录搜索头文件。
库文件:
编译的时候:
①gcc会去找-L
②再找gcc的环境变量LIBRARY_PATH
③再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的(不可配置的?)
运行时动态库的搜索路径:
动态库的搜索路径搜索的先后顺序是:
①编译目标代码时指定的动态库搜索路径(这是通过gcc 的参数"-Wl,-rpath,"指定。当指定多个动态库搜索路径时,路径之间用冒号":"分隔)
②环境变量LD_LIBRARY_PATH指定的动态库搜索路径(当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号":"分隔)
③配置文件/etc/ld.so.conf中指定的动态库搜索路径;
④默认的动态库搜索路径/lib;
⑤默认的动态库搜索路径/usr/lib。
(应注意动态库搜寻路径并不包括当前文件夹,所以当即使可执行文件和其所需的so文件在同一文件夹,也会出现找不到so的问题,类同#include <header_file>不搜索当前目录)
参考资源:http://my.oschina.net/alphajay/blog/4953?from=rss
C/C++ 头文件以及库的搜索路径的更多相关文章
- gcc编译时头文件和库文件搜索路径
特殊情况:用户自定义的头文件使用#include"mylib"时,gcc编译器会从当前目录查找头文件 一.头文件 gcc 在编译时寻找所需要的头文件 : ※搜寻会从-I开始( ...
- linux下gcc默认搜索头文件及库文件的路径
一.头文件gcc 在编译时如何去寻找所需要的头文件:※所以header file的搜寻会从-I开始※然后找gcc的环境变量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC ...
- linux gcc 编译时头文件和库文件搜索路径
一.头文件 gcc 在编译时寻找所需要的头文件 : ※搜寻会从-I开始 ※然后找gcc的环境变量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INC ...
- linux下gcc默认搜索的头文件及库文件路径
转自:https://blog.csdn.net/fd315063004/article/details/7925854 一.头文件 gcc 在编译时如何去寻找所需要的头文件:※所以header fi ...
- Makefile一 头文件及库搜索路径
头文件及库搜索路径 头文件的搜索路径: 头文件的搜索规则是:找到就使用,停止继续往下寻找 1: #include “mytest.h” 搜索的顺序为: (1)先搜索当前目录 (2)然后搜索编译时 -I ...
- gcc的搜索路径,头文件和库
1 抛开默认的搜索路径,自己指定搜索路径 第一,明确自己编写的代码所需要的头文件和库放在了哪里 第二,使用“-I”指定头文件的搜索路径,使用-rpath指定库的搜索路径 2 无论是本地编译还是交叉编译 ...
- linux下的头文件和库文件搜索路径 (转)
GCC 找头文件有三种策略: 1. 会在默认情况下指定到 /usr/include 文件夹 ( 更深层次的是一个相对路径, GCC 可执行程序的路径是 /usr/bin ,那么它在实际工作时指定头文 ...
- 链接(extern、static关键词\头文件\静态库\共享库)
原文链接:http://www.orlion.ga/781/ 一. 多目标文件的链接 假设有两个文件:stack.c: /* stack.c */ char stack[512]; int top = ...
- linux 头文件以及库的路径
原来在编译的时候可以指定执行时去哪里找需要的lib文件,长知识了 本文详细介绍了Linux 下gcc头文件指定方法,以及搜索路径顺序的问题.另外,还总结了,gcc动态链接的方法以及路径指定,同样也讨论 ...
随机推荐
- 队列——PowerShell版
继续读啊哈磊<啊哈!算法>感悟系列——队列 地铁售票处排队,先来的人先到队首先买完先走,后来的人排在队尾等候后买完后走. 想买票,必须排在队尾:买完票,只能从队首离开. 这种先进先出(Fi ...
- RTX——第12章 系统时钟节拍和时间管理
以下内容转载自安富莱电子: http://forum.armfly.com/forum.php 本章节为大家讲解 RTX 操作系统的时钟节拍和时间管理函数,其中时间管理函数是 RTX 的基本函数,初学 ...
- RSA算法工具
RSA算法工具-生成密钥对(生成密钥对) RSA算法工具-解析密钥对(导入密钥对,解析密钥对) RSA测试工具-计算分量(输入P,Q,E,计算出N,DP,DQ,Qinv)
- 【ExtJS】各种获取元素组件方法
1.get().getDom().getCmp().getBody().getDoc(): get(id/obj): get方法用来得到一个Ext元素,也就是类型为Ext.Element的对象, Ex ...
- Unity3D内容加密保护
仅管资源 (Assets) 在传输时可使用加密进行保护,但在数据流入客户手中后.其内容就有可能被获取.比如,有工具可记录驱动程序级别上的 3D 数据,同意用户提取传送至 GPU 的模型和纹理. 因此, ...
- WEB只能输入固定的字符
<head runat="server"> <title></title> <script type="text/javascr ...
- SQL Server 大数据量insert into xx select慢的解决方案
最近项目有个需求,把一张表中的数据根据一定条件增删改到另外一张表.按理说这是个很简单的SQL.可是在实际过程中却出现了超级长时间的执行过程. 后来经过排查发现是大数据量insert into xx s ...
- mount -t nfs 不能使用
去年使用一个新的文件系统的时候,发现mount -t nfs ip:/g/ftp ~/mnt -o tcp,nolock 不能使用 一直以为是因为mount 命令更新了,有些用法我不会用,但是刚才发现 ...
- QT4.8.5 QComboBox 增加选择菜单记录
QT4.8.5 QComboBox 增加选择菜单记录 因为软件需要测试多个UART ,多个LAN,当要测试多个同样功能的时候就可以使用QComboBox类实现一个菜单选择功能. 步骤如下: 1. 在U ...
- LACP-链路聚合
一. 术语 LA (Link aggregation): 链路聚合,不同厂家名称不同,ethernet channel(以太通道). LAG: Link aggregation group. LACP ...