文档章节

Linux操作系统的头文件和库文件搜索路径

双月通天
 双月通天
发布于 2016/02/01 15:44
字数 1187
阅读 146
收藏 3

一、 头文件


1 “”中的头文件,在源文件当前目录查找


2 -I 中指定目录 -I可以在CFLAG中指定


3 gcc的环境变量 C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, OBJC_INCLUDE_PATH


4 编译器预设路径、内定目录:


/usr/include


/usr/local/include


/usr/lib/gcc-lib/i386-linux/2.95.2/include


/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../include/g -3


/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../i386-linux/include


但是假如装gcc的时候,有给定的prefix的话,那么就是


/usr/include


prefix/include


prefix/xxx-xxx-xxx-gnulibc/include


prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include


此外还可用pkg-config 程序,用来在编译脚本中向编译器传递头文件包含路径或库文件路径。 Linux下那么多库,在./configure时时怎么判断它们存不存在的,难道是靠递归搜索?pkg-config这个命令和/*/lib/pkgconfig下的一些.pc文件才是主角。每个.pc文件定义了库的名字、路径、编译选项等,比如glib-2.0.pc文件:


prefix=/usr


exec_prefix=${prefix} 

libdir=/usr/lib 

includedir=${prefix}/include


glib_genmarshal=glib-genmarshal 

gobject_query=gobject-query 

glib_mkenums=glib-mkenums


Name: Glib 

Description: C Utilitiy Library 

Version: 2.14.4 

Libs: -L${libdir} -lglib-2.0 

Cflags: -I${includedir}/glib-2.0 -I${libdir}/glib-2.0/include


--cflags 参数可以给出在编译时所需要的选项,而 --libs 参数可以给出连接时的选项


configure到某个库的时候,pkg-config命令会首先去环境变量PKG_CONFIG_PATH定义好的路径下搜索库名字对应的.pc文件(库名加.pc),找到了就行了,等会儿make的时候就可以通过正则表达式取出libs和cflags的值来使用。


如configure文件中有:


pkg_XLIB_CFLAGS='$PKG_CONFIG --cflags "x11" 2>/dev/null'(还是`***`)(结果是-I的形式)


(x11表示libx11库),这些参数配置结束后写入Makefile。


配置 pkgconfig


PKG_CONFIG_PATH 的缺省设置是 /lib/pkgconfig, /usr/lib/pkgconfig 和 /usr/local/lib/pkgconfig. 这些设置都是硬编码的,所以不用另外设置它们。


二、 库文件


Ø 编译的时候动态库的搜索路径:


1 gcc会去找-L 指定的路径和 -l指定的库(指定库的路径)


2 由'-rpath-link'选项指定的搜索路径 在LDFLAGS中gcc 的参数"-Wl,-rpath-link,-Wl"指定。 '-rpath-link'比‘-L’多一功能,指定的目录还可用于搜索依赖库。


3 由'-rpath'指定的搜索路径. '-rpath'跟'-rpath_link'的不同之处在于,由'-rpath'指定的路径被包含在可执行文件中,并在运行时使用, 而'-rpath-link'选项仅仅在连接时起作用.'-rpath'比'-rpath-link'多一功能,指定路径编译进程序,当程序运行时,首先从这些目录中寻找库。


4 再找内定目录 /lib、 /usr/lib、 /usr/local/lib 这是当初compile gcc时写在程序内的


  '-rpath'跟'-rpath_link'用来指定依赖库的路径


Ø 对于交叉编译,链接时库搜索路径及优先顺序如下:


1 -rpath-link 指定


2 -rpath 指定


3 –L 指定


4 连接器的默认链接目录,通常在交叉编译器目录下。


Ø 如何指定-rpath-link :在configure之前设置LDFLAGS,如


export LDFLAGS = " -Wl,-rpath-link -Wl,目录/lib"(-Wl表示用于连接器)


在configure文件中也有:


pkg_XLIB_CFLAGS='$PKG_CONFIG --libs "x11" 2>/dev/null'(还是`***`)


Ø 运行时动态库的搜索路径


1Ø进程启动时加载


首先  LD_PRELOAD


1、 -rpath指定目录(在编译目标代码时指定程序的动态库搜索路径"-Wl,-rpath,"指定)


2、 通过环境变量LD_LIBRARY_PATH指定动态库搜索路径(当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号":"分隔)


3、 /etc/ld.so.cache中指定的动态库搜索路径, 由ldconfig读取配置文件/etc/ld.so.conf 生成。


4、 默认的动态库搜索路径/lib


5、 默认的动态库搜索路径/usr/lib


2Ø 运行时加载 dlopen()


第一个参数:指定共享库的名称,将会在下面位置查找指定的共享库。 

-/开头,绝对路径,名字必须完全匹配。


-环境变量LD_LIBRARY_PATH列出的用分号间隔的所有目录。 

-文件/etc/ld.so.cache中找到的库的列表,用ldconfig维护。 

-目录usr/lib。 

-目录/lib。 

-当前目录。 

第二个参数:指定如何打开共享库。  

其中flag有:RTLD_LAZY RTLD_NOW RTLD_GLOBAL,其含义分别为: 

RTLD_LAZY:在dlopen返回前,对于动态库中存在的未定义的变量(如外部变量extern,也可以是函数)不执行解析,就是不解析这个变量的地址。 

RTLD_NOW:与上面不同,他需要在dlopen返回前,解析出每个未定义变量的地址,如果解析不出来,在dlopen会返回NULL,错误为: 

: undefined symbol: xxxx....... 

RTLD_GLOBAL:它的含义是使得库中的解析的定义变量在随后的随后其它的链接库中变得可以使用。


本文转载自:

双月通天
粉丝 40
博文 324
码字总数 300254
作品 0
徐汇
程序员
私信 提问
gcc指定头文件路径及动态链接库路径

gcc指定头文件路径及动态链接库路径 本文详细介绍了linux 下gcc头文件指定方法,以及搜索路径顺序的问题。另外,还总结了,gcc动态链接的方法以及路径指定,同样也讨论了搜索路径的顺序问题。...

长平狐
2013/06/17
12.4K
0
Linux 程序设计--读书笔记

1 Linux 程序设计 1.1 Linux shell 登录进 Linux 与 shell 进行交互时, 它像 Windows 中的命令提示窗口一样运行程序. 它在一组指定的目录路径下按照你给出的程序名搜索与之同名的文件. 搜索的...

yuberhu
2018/05/06
0
0
[动态库]深入分析Windows和Linux动态库应用异同

摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Linux系统中都有动态库的概念,采用动态库可以有效的减少程序大小,节省空间,提高效率,增加程序的可扩展性,便于模块化管理。 ...

龙宝宝
2011/08/05
172
0
深入分析Windows和Linux动态库应用异同

摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Linux系统中都有动态库的概念,采用动态库可以有效的减少程序大小,节省空间,提高效率,增加程序的可扩展性,便于模块化管理。 ...

晨曦之光
2012/03/02
114
0
在Linux平台上如何使用接静态库和共享库

1、Linux函数库介绍 函数库可以看做是事先编写的函数集合,它可以与主函数分离,从而增加程序开发的复用性。Linux中函数库可以有3种使用的形式:静态、共享和动态。 1) 静态库的代码在编译时...

晨曦之光
2012/03/09
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

redis 内存信息解析

used_memory:由 Redis 分配器分配的内存总量,包含了redis进程内部的开销和数据占用的内存,以字节(byte)为单位 used_memory_rss:向操作系统申请的内存大小。与 top 、 ps等命令的输出一...

Canaan_
12分钟前
2
0
windows 下 python3 安装 pip setuptools

本文链接:https://blog.csdn.net/huzuxing/article/details/80807744 最近在家使用python的时候,总是报setuptools 模块未找到,于是在网上搜索了相关解决办法,但是都没有解决问题。 于是去...

开源中国首席CYO
18分钟前
2
0
数据库添加索引

mysql索引添加 navicat 步骤 - 选择表 -> 设计表 ->索引

以谁为师
28分钟前
3
0
java7与java9中的try-finally关闭资源

1.java7中的try 在java7之前,对于一些需要使用finally关闭资源的操作,会显得很臃肿. try{//}catch(Exception e){//}finally{if(xxxx != null){xxxx.close();}} 在jav...

Blueeeeeee
29分钟前
2
0
字节序转换详解

在跨平台和网络编程中我们经常会提到网络字节序和主机字节序,如果没有正确对两者进行转换,从而导致两方产生了不同的解释,就会出现意想不到的bug。 目录 0x01 概念 0x02 分类 0x03 两种字节...

无心的梦呓
39分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部