库文件包含静态库文件和动态库文件。
静态库就是在链接的时候加入到执行代码中,成为了代码的一部分,所以生成的可执行文件就比较大,以后和静态库没瓜葛了,自己随便用了;动态库是指运行的时候会链接到库文件,如果没找到就运行。
先介绍一下默认的库搜索路径,这些默认搜索路径是不分动态库和静态库的,都会在前面几个路径都找不到的情况来这儿找,所以这个是优先级最低的。
一般 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