1. 连接和运行时库文件搜索路径到设置
库文件在连接(静态库和共享库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的。一般 Linux 系统把 /lib 和
/usr/lib
两个目录作为默认的库搜索路径,所以使用这两个目录中的库时不需要进行设置搜索路径即可直接使用。对于处于默认库搜索路径之外的库,需要将库的位置添加到
库的搜索路径之中。设置库文件的搜索路径有下列两种方式,可任选其一使用:
(1). 在 /etc/ld.so.conf
文件中添加库的搜索路径。(或者在/etc/ld.so.conf.d 下新建一个.conf文件,将搜索路径一行一个加入-junziyang)
将自己可能存放库文件的路径都加入到/etc/ld.so.conf中是明智的选择添加方法也极其简单,将库文件的绝对路径直接写进去就OK了,一行一
个。例如:
/usr/X11R6/lib
/usr/local/lib
/opt/lib
需要注意的是:这种搜索路径的设置方式对于程序连接时的库(包括共享库和静态库)的定位已经足够了,但是对于使用了共享库的程序的执行还是不够的。这是因
为为了加快程序执行时对共享库的定位速度,避免使用搜索路径查找共享库的低效率,所以是直接读取库列表文件 /etc/ld.so.cache
从中进行搜索的。/etc/ld.so.cache 是一个非文本的数据文件,不能直接编辑,它是根据 /etc/ld.so.conf
中设置的搜索路径由 /sbin/ldconfig 命令将这些搜索路径下的共享库文件集中在一起而生成的(ldconfig 命令要以 root
权限执行)。
因此,为了保证程序执行时对库的定位,在 /etc/ld.so.conf
中进行了库搜索路径的设置之后,还必须要运行 /sbin/ldconfig 命令更新 /etc/ld.so.cache
文件之后才可以。ldconfig
,简单的说,它的作用就是将/etc/ld.so.conf列出的路径下的库文件缓存到/etc/ld.so.cache
以供使用。因此当安装完一些库文件,(例如刚安装好glib),或者修改ld.so.conf增加新的库路径后,需要运行一下
/sbin/ldconfig使所有的库文件都被缓存到ld.so.cache中,如果没做,即使库文件明明就在/usr/lib下的,也是不会被使用
的,结果编译过程中抱错,缺少xxx库,去查看发现明明就在那放着,搞的想大骂computer蠢猪一个。
在程序连接时,对于库文件(静态库和共享库)的搜索路径,除了上面的设置方式之外,还可以通过 -L 参数显式指定。因为用 -L
设置的路径将被优先搜索,所以在连接的时候通常都会以这种方式直接指定要连接的库的路径。
这种设置方式需要
root 权限,以改变 /etc/ld.so.conf 文件并执行 /sbin/ldconfig 命令。而且,当系统重新启动后,所有的基于
GTK2 的程序在运行时都将使用新安装的 GTK+ 库。不幸的是,由于 GTK+
版本的改变,这有时会给应用程序带来兼容性的问题,造成某些程序运行不正常。为了避免出现上面的这些情况,在 GTK+
及其依赖库的安装过程中对于库的搜索路径的设置将采用另一种方式进行。这种设置方式不需要 root 权限,设置也简单。
(2). 在环境变量 LD_LIBRARY_PATH 中指明库的搜索路径。
设置方式:
export LD_LIBRARY_PATH=/opt/gtk/lib:$LD_LIBRARY_PATH
可以用下面的命令查看 LD_LIBRAY_PATH 的设置内容:
echo
$LD_LIBRARY_PATH
至此,库的两种设置就完成了。
2.交叉编译时候如何配置连接库的搜索路径
交叉编译的时候不能使用本地(i686机器,即PC机器,研发机器)机器上的库,但是在做编译链接的时候默认的是使用本地库,即/usr/lib,
/lib两个目录。因此,在交叉编译的时候,要采取一些方法使得在编译链接的时候找到需要的库。
首先,要知道:编译的时候只需要头文档,真正实际的库文档在链接的时候用到。 (这是我的理解,假如有不对的地方,敬请网上各位大侠指教)
然后,讲讲如何在交叉编译链接的时候找到需要的库。
(1)交叉编译时候直接使用-L和-I参数指定搜索非标准的库文档和头文档的路径。例如:
arm-linux-gcc
test.c -L/usr/local/arm/2.95.3/arm-linux/lib
-I/usr/local/arm/2.95.3/arm-linux/include
(2)使用ld.so.conf文档,将用到的库所在文档目录添加到此文档中,然后使用ldconfig命令刷新缓存。
(3)使用如下命令:
export
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/arm/2.95.3/arm-linux-lib
参见《ld.so.conf 文档和PKG_CONFIG_PATH变量》这篇文章。
通过环境变量LD_LIBRARY_PATH指定动态库搜索路径(!)。
通过设定环境变量LD_LIBRARY_PATH也可以指定动态库搜索路径。当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号":"分隔。
不过LD_LIBRARY_PATH的设定作用是全局的,过多的使用可能会影响到其他应用程序的运行,所以多用在调试。(LD_LIBRARY_PATH
的缺陷和使用准则,可以参考《Why LD_LIBRARY_PATH is bad》
)。通常情况下推荐还是使用gcc的-R或-rpath选项来在编译时就指定库的查找路径,并且该库的路径信息保存在可执行文件中,运行时它会直接到该路
径查找库,避免了使用LD_LIBRARY_PATH环境变量查找。
(4)交叉编译时使用软件的configure参数。例如我编译minigui-1.3.3,使用如下配置:
#!/bin/bash
rm -f config.cache config.status
./configure --build=i686-linux --host=arm-linux --target=arm-linux \
CFLAGS=-I/usr/local/arm/2.95.3/arm-linux/include \
LDFLAGS=-L/usr/local/arm/2.95.3/arm-linux/lib \
--prefix=/usr/local/arm/2.95.3/arm-linux \
--enable-lite \
--disable-galqvfb \
--disable-qvfbial \
--disable-vbfsupport \
--disable-ttfsupport \
--disable-type1support \
--disable-imegb2312py \
--enable-extfullgif \
--enable-extskin \
--disable-videoqvfb \
--disable-videoecoslcd
这里我配置了CFLAGS和LDFLAGS参数,这样一来,我就不用去修改每个Makefile里-L和-I参数了,也不用再去配置
LD_LIBRARY_PATH或改写ld.so.conf文档了。
Linux下动态库使用小结
1. 静态库和动态库的基本概念
静态库,是在可执行程序连接时就已经加入到执行码中,在物理上成为执行程序的一部分;使用静态库编译的程序运行时无需该库文件支持,哪里都可以用,但是生
成的可执行文件较大。动态库,是在可执行程序启动时加载到执行程序中,可以被多个可执行程序共享使用。使用动态库编译生成的程序相对较小,但运行时需要库
文件支持,如果机器里没有这些库文件就不能运行。
2. 如何使用动态库
如何程序在连接时使用了共享库,就必须在运行的时候能够找到共享库的位置。linux的可执行程序在执行的时候默认是先搜索/lib和/usr/lib这
两个目录,然后按照/etc/ld.so.conf里面的配置搜索绝对路径。同时,Linux也提供了环境变量LD_LIBRARY_PATH供用户选择
使用,用户可以通过设定它来查找除默认路径之外的其他路径,如查找/work/lib路径,你可以在/etc/rc.d/rc.local或其他系统启动
后即可执行到的脚本添加如下语句:LD_LIBRARY_PATH
=/work/lib:$(LD_LIBRARY_PATH)。并且LD_LIBRARY_PATH路径优先于系统默认路径之前查找(详细参考《使用
LD_LIBRARY_PATH》)。
不过LD_LIBRARY_PATH的设定作用是全局的,过多的使用可能会影响到其他应用程序的运行,所以多用在调试。(LD_LIBRARY_PATH
的缺陷和使用准则,可以参考《Why LD_LIBRARY_PATH is
bad》)。通常情况下推荐还是使用gcc的-R或-rpath选项来在编译时就指定库的查找路径,并且该库的路径信息保存在可执行文件中,运行时它会直
接到该路径查找库,避免了使用LD_LIBRARY_PATH环境变量查找。
3.库的链接
时路径和运行时路径
现代连接器在处理动态库时将链接时路径(Link-time
path)和运行时路径(Run-time
path)分开,用户可以通过-L指定连接时库的路径,通过-R(或-rpath)指定程序运行时库的路径,大大提高了库应用的灵活性。比如我们做嵌入式
移植时#arm-linux-gcc $(CFLAGS) –o target –L/work/lib/zlib/ -llibz-1.2.3
(work/lib/zlib下是交叉编译好的zlib库),将target编译好后我们只要把zlib库拷贝到开发板的系统默认路径下即可。或者通过-
rpath(或-R )、LD_LIBRARY_PATH指定查找路径。
相关推荐
opencv 2.4.13 静态库 for linux
很多人编译的opencv静态库有问题,因为缺少了 libpng等静态库,这里给大家编译好了,欢迎下载。我个人的系统是ubuntu64 。
Linux 静态库与动态库搜索路径设置详解【转】
原文地址:http://blog.chinaunix.net/uid-29025972-id-3855495.html 1. 连接和运行时库文件搜索路径的设置 库文件在连接(静态库和共享库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的。一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认的库搜索路径,所以使用这两个目...
Linux系统中如何添加自己的库文件路径
库文件在连接(静态库和共享库)和运行(于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的。一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认的库搜索路径,所以使用这两个目录中的库时不需要进行设置搜索路径即可直接使用。对于处于默认库搜索路径之外的库,需要将库的位置添加到 库的搜索路径之中。设置库文件的搜索路径有下列两种方式,可任选其一使用: 1. 在环境变量 LD_LIBRARY_PATH 中指明库的搜索路径。 2. 在 /etc/ld.so.conf 文件中添加库的搜索路径。 将自己可能存放库文件的路径都加入到/etc/ld.so.conf中
Linux之静态库和动态库
静态库和动态库下面我们将从工程师的角度,去了解静态库和动态库的形成过程,以及实现它们的制作。并且了解如何将自己的库交给别人,让别人也可以使用。
MT6771 Android13 背光曲线调试与光感数据校准实战
本文详细介绍了MT6771平台在Android 13系统上进行背光曲线调试与光感数据校准的实战经验。针对高亮度环境下背光误调节问题,深入分析了光感数据上报机制,并提供了驱动层配置修改、背光曲线优化及常见问题解决方案,帮助开发者快速定位并解决类似问题。
ros1 ubuntu22.04 安装教程
ROS1 ubuntu22.04 安装教程
【Linux】动态库与静态库
手动创建并深入了解动态库与静态库
软件测试 | 手把手教你如何使用 Charles 抓包工具(电脑+手机端)
软件测试 | 手把手教你如何使用 Charles 抓包工具(电脑+手机端)一、Charles简介二、Charles下载与安装三、Charles配置(1)Charles-PC端的配置如下:(2)过滤网络请求:(3)Charles抓取HTTPS请求包前置条件:(4)Charles抓取HTTPS双向认证包:关注我,免费领取学习资料 嘿。大家好,我是4U: 做过 APP 测试的同学都会接触抓包工具,通过抓包工具可以获取到客户端与服务端接口的交互数据,在实际测试APP的过程中,我们往往会发现服务端返回 的参数字段错
Linux动态库与静态库技术详解
本文详细介绍了Linux系统中静态库与动态库的技术原理与应用。静态库在编译时完整链接到可执行文件中,具有独立性强但体积大的特点;动态库在运行时加载,实现代码共享,节省资源但存在依赖关系。文章通过对比表格清晰展示了两者在链接时机、内存使用、更新维护等方面的差异,并提供了创建、使用库的详细命令示例。此外,还涵盖了版本控制、库搜索路径、常见问题解决等高级主题,以及针对不同场景的选型建议。最后总结了开发中的最佳实践,帮助开发者根据需求合理选择库类型,构建高效可维护的Linux应用。
手把手教你低成本复刻大疆C板缓启动电路(附原理图与选型清单)
本文详细介绍了如何低成本复刻大疆C板缓启动电路,包括核心器件选型、电路搭建与调试实战、参数优化方法论及进阶改进思路。通过替代型号和优化设计,实现功能相近的缓启动电路,成本不到原方案的1/3,适合电子爱好者、在校学生和预算紧张的硬件工程师。
银河麒麟高级服务器操作系统V10SP2(X86)PXE无人值守批量部署实战指南
本文详细介绍了银河麒麟高级服务器操作系统V10SP2(X86)PXE无人值守批量部署的实战指南。通过PXE网络引导技术,实现全自动化、高效率的系统部署,特别适用于企业级数据中心和国产化替代项目。文章涵盖基础环境准备、关键服务配置、Kickstart高级定制及部署测试等核心内容,帮助用户快速掌握批量部署技巧。
【Linux】静态库和动态库
【Linux】动态库和静态库的认识及其制作,动静态库的加载
车辆TBOX科普 第69次 TBOX行业发展趋势与就业前景深度解析
TBOX技术革新驱动汽车智能化发展 Telematics BOX(TBOX)正快速从车辆状态监控器进化为整车智能核心,市场年增速超25%,2025年规模将达150亿美元。技术呈现四大革新方向:5G与V2X集成实现多模通信网关,支持10-20Gbps高速传输;多模GNSS融合定位精度达厘米级,北斗系统提供独特优势;边缘计算架构使TBOX具备本地AI处理能力,减少95%数据上传;硬件安全模块(HSM)成为标配,满足EVITA标准的安全需求。这些技术突破正重塑TBOX架构,使其从单纯通信管道升级为智能网联汽车的关
Linux 指定动态库搜索路径、静态库和动态库、LD_LIBRARY_PATH
Linux 指定动态库搜索路径 方法一:配置文件/etc/ld.so.conf中指定的动态库搜索路径,需要执行 /sbin/ldconfig使之生效。 方法二:环境变量LD_LIBRARY_PATH指定的动态库搜索路径。 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib 上面的设置方式只是临时的,假如重新启动一个窗口,需要重新设置。 方法三:编译代码指定动态库路径。 注意:第三种比较容易出错,当编译指定了动态库路径,生成的可执行文件默认搜索路径按
串级PID 位置环+速度环
串级PID 位置环+速度环
(南京观海微电子)——GH700X调试指南--SPI 接口+LVDS-测试盒使用方法
1表示OTP完成后,读取烧录值是否一致来判断是否烧录成功,2表示同时检测VCOM是否一致以及烧录次数是否增加,3表示不做任何检测,由用于自行在程序中判断。[格式]:SetFindVcomEn (<开启或关闭>),ON表示开启VCOM搜寻,默认是开启的,只要使能OTP烧录,按OTP按键则进行VCOM查询;[功能]:OTP完成检测类别,用于设置OTP完成后检测OTP次数还是OTP值来判断OTP是否成功。[功能]:用于设置VCOM查询使能,比如需要烧全代码而不需要对VCOM查询时,可以禁止VCOM查询。
《Linux:动态库动态链接与静态库静态链接》
静态库与静态链接、动态库与动态链接、运行动态库的四种方式、动静态库的加载。
IDEA的使用指南
IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.
【Linux】动态库、静态库
动态库与静态库相关内容
VC中sqlite的使用
在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示
IMSL CNL 7.0.0 (x86-64)Crack
IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件
C++静态库与动态库的区别
&nbs...
精雕软件(JDpaint) 5.5 绿色版
精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版
【Linux:动态库与静态库】
有关Linux动静态库的详细讲解,帮助你更加深刻的认识和理解动静态库。
Linux——动态库和静态库
与静态库不同,动态库的代码不会被复制到每个程序中,而是在程序运行时从库文件中加载。这意味着当你链接一个静态库到你的程序时,库中的代码会被复制到最终的二进制文件里。在Linux中,链接过程分为两个阶段:编译(Compilation)和链接(Linking)。在实际开发中,开发者可能会根据项目的特点和部署环境来决定使用哪种类型的库。静态库和动态库各有优缺点,选择使用哪一种通常取决于具体的应用场景和需求。对于静态库,链接发生在编译阶段,而动态库的链接则发生在程序运行时。(动态链接器)能够找到并加载正确的库文件。
Linux系统编程——超级详细讲解静态库、动态库的创建、打包和使用
在Linux环境下,我们使用gcc编译连接代码时,可以分为静态链接和动态链接。静态链接即在编译链接时,将代码所使用到的静态库文件代码全部加入到可执行文件中(拷贝实质上是将库文件的代码展开拷贝至我们的可执行程序的代码段。,这样做的缺点是可执行文件会生成的比较大,优点是此时再运行可执行文件就不需要再查找库了。静态库文件一般以.a结尾。动态库链接不会在编译时将动态库文件的代码加入到可执行文件中,而是在可执行文件运行时,去查找所需的动态库,并将其加载到相应的进程中,并且不同的进程可以共享这些动态库。
静态库和动态库
静态库和动态库是两种不同的代码共享方式。静态库在编译时直接链接到可执行文件中,而动态库在运行时才加载。动态库支持多进程共享,节省磁盘和内存空间。开发者通过生成头文件和库文件(.o目标文件)来提供功能接口。使用静态库需指定路径和库名(-I、-L、-l选项),动态库还需额外配置加载路径(如环境变量或系统目录)。动态库采用位置无关码(-fPIC)实现灵活加载,其共享特性通过写时拷贝机制保证线程安全。程序加载时通过虚拟地址到物理地址的映射完成指令执行。
【Linux】动态库丢了程序就崩?一文讲清动态 / 静态库区别 + Linux 静态库安装教程
本文介绍了程序开发中的两种重要代码库:动态库和静态库。在Linux系统中,动态库为.so文件,静态库为.a文件;Windows系统中则分别为.dll和.lib文件。文章详细讲解了gcc编译器如何处理这两种库,包括默认的动态链接和通过-static选项实现的静态链接。动态链接优势在于节省空间和便于更新,但依赖性强;而静态链接程序独立性强但体积较大。实际开发中应根据项目需求选择合适的方式,桌面应用推荐动态链接,嵌入式开发则更适合静态链接。理解这两种库的特点和适用场景,能帮助开发者更高效地进行程序构建和部署。
linux 下的静态库与动态库
本文介绍了动态库与静态库的区别,并详细介绍了如何生成与使用。
209



被折叠的 条评论
为什么被折叠?



