静态库和共享库 库的定位搜索路径
库文件在连接(静态库和共享库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的.一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认的库搜索路径,使用这两个目录中的库时不需要进行设置搜索路径即可直接使用.对于处于默认库搜索路径之外的库,需要将库的位置添加到库的搜索路径之中.设置库文件的搜索路径有下列两种方式,可任选其一使用: 在环境变量 LD_LIBRARY_PATH 中指明库的搜索路径. 在 /etc/ld.so.conf 文件中添加库的搜索路径. 将自己可能存放库文件的路径都加入到/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 设置的路径将被优先搜索,在连接的时候通常都会以这种方式直接指定要连接的库的路径.
前面已经说明过了,库搜索路径的设置有两种方式: 在环境变量 LD_LIBRARY_PATH 中设置 在 /etc/ld.so.conf 文件中设置. 其中,第二种设置方式需要 root 权限,以改变 /etc/ld.so.conf 文件并执行 /sbin/ldconfig 命令.,当系统重新启动后,所有的基于 GTK2 的程序在运行时都将使用新安装的 GTK 库.不幸的是, GTK 版本的改变,这有时会给应用程序带来兼容性的问题,造成某些程序运行不正常.为了避免出现上面的这些情况,在 GTK 及其依赖库的安装过程中对于库的搜索路径的设置将采用第一种方式进行.这种设置方式不需要 root 权限,设置也简单: $ export LD_LIBRARY_PATH=/opt/gtk/lib:$LD_LIBRARY_PATH 可以用下面的命令查看 LD_LIBRAY_PATH 的设置内容: $ echo $LD_LIBRARY_PATH 至此,库的两种设置就完成了. 交叉编译时候如何配置连接库的搜索路径 交叉编译的时候不能使用本地(i686机器,即PC机器,研发机器)机器上的库,但是在做编译链接的时候默认的是使用本地库,即/usr/lib,/lib两个目录.因此,在交叉编译的时候,要采取一些方法在编译链接的时候找到需要的库. ,要知道:编译的时候只需要头文档,真正实际的库文档在链接的时候用到. (这是我的理解,假如有不对的地方,敬请网上各位大侠指教) 然后,讲讲如何在交叉编译链接的时候找到需要的库. (1)、交叉编译时候直 |
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |