linux头文件 库,Linux操作系统的头文件和库文件搜索路径
一、 头文件
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:它的含义是使得库中的解析的定义变量在随后的随后其它的链接库中变得可以使用。
linux头文件 库,Linux操作系统的头文件和库文件搜索路径相关推荐
- linux怎么添加头文件目录下,linux下编写c++,include的那些头文件在什么地方?
炎炎设计 C/C++程序在linux下被编译和连接时,GCC/G++会查找系统默认的include和link的路径,以及自己在编译命令中指定的路径.自己指定的路径就不说了,这里说明一下系统自动搜索的路 ...
- linux配置路径,Linux下配置搜索路径
截取部分于:http://james23dier.iteye.com/blog/733030 库文件在连接(静态库和共享库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的.一 ...
- 【大数据 / linux 系统 / KEN】linux 基本命令的使用(3)
linux基本命令的使用 首次发布时间:2020/7/10 最后修改时间:2020/7/10 摘要 常用 Linux 命令的基本使用 ls 常用选项及通配符的使用 切换目录 删除目录/文件 修改文件名 ...
- rpath添加依赖库搜索路径
windows 下一个程序的dll搜索路径首先是程序目录,然后是一些系统目录.linux 下的可以通过设置 LD_LIBRARY_PATH 等方法来添加搜索路径,但是这些路径是定死的,如果要实现程序目 ...
- Linux下gcc编译中关于头文件与库文件搜索路径相关问题
如何指定GCC的默认头文件路径 网上偶搜得之,以之为宝:) 原地址:http://blog.chinaunix.net/u/28781/showart.php?id=401631 ========== ...
- linux+C环境下动态管理头文件和库文件
本文共分三个部分:首先给出了一个简单的Makefile的例子,然后分别详细阐述了头文件和库文件的相关知识 1.一个Makefile的例: -L是指定链接时搜索路径,比如-L./等: -l是指定具体的库 ...
- linux cpp标准库,标准库以及标准头文件
源文件通过编译可以生成目标文件(例如 GCC 下的 .o 和 Visual Studio 下的 .obj),并提供一个头文件向外暴露接口,除了保护版权,还可以将散乱的文件打包,便于发布和使用. 实际上 ...
- linux 头文件卫士,条件编译,头文件,静态库,共享库与多文件编程
原标题:条件编译,头文件,静态库,共享库与多文件编程 本文转载自嵌入式Linux中文站条件编译 条件编译即满足某些条件的时候编译某部分代码,常用于开发多个版本的程序,当满足条件A时,编译出免费版本的软 ...
- linux下mkdir头文件_整理Linux下gcc编译中关于头文件与库文件搜索路径相关问题
态库./libpos.so. /root/test/env/lib/libpos.so和/root/test/conf/lib/libpos.so.我们再用源程序 pos_lib.c(见程序5)来创建 ...
最新文章
- vue 调用共众url_vue单页面,在微信公众号支付中遇到的URL未注册BUG解决方法-Go语言中文社区...
- 1231 sqlserver_sqlserver 删除表中 指定字符串
- mac redis 客户端_分享一个免费好用的Redis桌面客户端
- 机器学习算法 随机森林学习 之决策树
- 提升 Linux 终端命令敲写效率的快捷键参考
- VeryCD 电驴(easyMule) 1.1.9 稳定版
- 用JAVA写一个小游戏程序难不难?具体步骤怎么操作?
- Windows系统磁盘清理C盘扩容
- 推荐三款好用的终端开发平台
- Gym101635C Macarons
- linux的文件系统及vim编辑器系统指令
- 计算机双语论文,计算机双语教学初探论文
- ospf状态机-通俗易懂的小故事
- 【OpenCV 例程300篇】208. Photoshop 对比度自动调整算法
- 基于stm32的音乐喷泉设计
- 设计模式学习之锦囊妙计定乾坤
- P2895 [USACO08FEB]Meteor Shower S
- C#/VB.NET 自定义PPT动画路径
- Jmeter压力测试简单教程(包括服务器状态监控)-----转载自lsoqvle 的博客(https://blog.csdn.net/cbzcbzcbzcbz/article/details/780)
- 国外美金调查项目,到底靠谱不靠谱