1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > linux下链接库文件默认搜索路径

linux下链接库文件默认搜索路径

时间:2023-01-23 03:21:05

相关推荐

linux下链接库文件默认搜索路径

库文件包含静态库文件和动态库文件。

静态库就是在链接的时候加入到执行代码中,成为了代码的一部分,所以生成的可执行文件就比较大,以后和静态库没瓜葛了,自己随便用了;动态库是指运行的时候会链接到库文件,如果没找到就运行。

先介绍一下默认的库搜索路径,这些默认搜索路径是不分动态库和静态库的,都会在前面几个路径都找不到的情况来这儿找,所以这个是优先级最低的。

一般 Linux 系统把

/lib/usr/lib/usr/local/lib (☆)

作为默认的库搜索路径,所以使用在这三个目录中的链接库文件可直接被搜索到。

这三个路径有什么区别?一般用哪个呢?怎么用呢?

很多应用都安装在/usr/local下面。我们可以看automake工具,定义的默认前缀就就是/usr/local。

Directory variable Default value prefix /usr/local exec_prefix ${prefix} bindir ${exec_prefix}/bin libdir ${exec_prefix}/lib …

因为,usr 指 Unix System Resource,/usr;/usr/bin目录包含所有的命令、程序库、文档和其它文件,我们可以移动到这个目录下,ls -al看下,都是系统预装的可执行程序,会随着系统的升级而改变,/usr/local/bin目录是给用户放置自己的可执行程序,所以我们一般把我们可执行的脚本文件放到这个目录。

使用方法:

方法一:直接拷贝到/usr/local/lib目录下;

方法二:你可以创建一个软连接到/usr/local/lib,这样就完成了映射,也是可以找到的。但是我想了想,万一删除了这个库文件呢?那创建的软连接不就失效了吗。。所以感觉拷贝靠谱点。

sudo ln -s//home/zss/桌面/network_programming/libyolanda.a /usr/lib/libyolanda.a#这里我没有用/usr/local/bin的原因是我当时还不知道两者的区别

静态库的搜索路径:

优先级最高的就是直接在链接的时候添加路径

比如我们这里有一个静态库,叫“libtest.a”吧。你要通过gcc去链接的话就要写下面的指令:

gcc main.c -L. -ltest

就是说把main.c文件和libtest库链接起来,这里参数-Lpath,直接是连着一起写的,所以这里-L.就表示链接当前目录的xxx文件,当gcc看到-ltest的时候, 会自动去找去找libtest.a。(不过我个人觉得这种方法不好用,因为现在写一个大型项目,是不是都用 cmake了啊,makefile感觉也用的少了吧,不太懂。。以后好回来填坑吧啊)

使用环境变量"LIBRARY_PATH"指定链接库搜寻路径

#方法一:export LD_LIBRARY_PATH=LD_LIBRARY_PATH:XXXX# ":"是分割路径的,后面xxxx表示库所在的路径,表示新加了xxxx搜索路径#缺点,这只是临时添加,下次开机就没了~#方法二:#首先找到你的配置文件.bashrc,你可以用locate .bashrclocate .bashrc#其次在打开这个文件vim /home/zss/.bashrc#把刚刚的路径添加一遍export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:XXXX#这样的话,每次开机 ,.bashrc都会运行一遍,所以就又把这个XXXX路径给加进去了

使用ld连接脚本中的 “SEARCH_DIR” 指定链接库搜寻路径

使用“ld –verbose”命令查看gcc的默认链接脚本中SEARCH_DIR参数,拷贝libsay.so到SEARCH_DIR指定路径。

(这种方法我没用过)

SEARCH_DIR("=/usr/local/lib/x86_64-linux-gnu"); SEARCH_DIR("=/lib/x86_64-linux-gnu");SEARCH_DIR("=/usr/lib/x86_64-linux-gnu"); SEARCH_DIR("=/usr/local/lib64");SEARCH_DIR("=/lib64"); SEARCH_DIR("=/usr/lib64"); SEARCH_DIR("=/usr/local/lib");SEARCH_DIR("=/lib"); SEARCH_DIR("=/usr/lib"); SEARCH_DIR("=/usr/x86_64-linux-gnu/lib64");SEARCH_DIR("=/usr/x86_64-linux-gnu/lib");

最后一种就是一开始就说的默认搜索路径。目前我是觉得直接拷贝到那里蛮好的!

动态库的搜索路径:

优先级最高的是编译时指定的动态库搜索路径

gcc –Wl,-rpath=.#选项–Wl,-rpath 以及 =来指定搜索路径

同样感觉用的比较少,因为自己现在还没有涉及到动态库的链接,往往都是简短的代码链接一个静态库。

环境变量LD_LIBRARY_PATH指定动态库的搜索路径。

这里可以去参考静态库的,一模一样。

配置文件/etc/ld.so.conf中指定动态库搜索路径。

首先打开这个文件,跑到文件最后添加你动态库的绝对路径,然后idconfig修改生效都可以了。

最后就是默认的库搜索路径了,就是一开始提到的三个。

关于《后台开发核心技术与应用实践》书中第127页关于动态链接知识点,有一个题目,当时自己一直没懂,今天参考别人文章的时候想到了别人为什么这样解决。

题目:错误提示找不到动态库文件libmymath.so

解决步骤:

cp libmymath.so /usr/libexport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/libsudo idconfig

有一点要特别注意,export LD_LIBRARY_PATH=...,这个等号是要直接接在PATH后面的,千万不能打空格,否者会显示command not found。还有就是我的疑惑在,既然已经把动态库拷贝到目录文件下,为啥还要在环境变量LD_LIBRARY_PATH中添加/usr/lib吗?这不是多此一举吗?后来我想到动态库的搜索路径也是有顺序的,既然是动态库,在运行时期链接,肯定是希望越快越好,所以我们再添加到LD_LIBRARY_PATH中,让编译器能更快的找到。不过这个全局变量也许会带来一定危害吧!汗。在下文中提到了。不深究可以不看了 。

引文:/beizhengren/article/details/77978949

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。