文章目录
找不到库的问题
没有安装libevent,先安装。
报错信息如下
$ ./event
./event: error while loading shared libraries: libevent-2.1.so.6:
cannot open shared object file: No such file or directory
查看缺什么库
$ ldd event
linux-vdso.so.1 => (0x00007ffec6fda000)
libevent-2.1.so.6 => not found
libc.so.6 => /lib64/libc.so.6 (0x00007fab80936000)
/lib64/ld-linux-x86-64.so.2 (0x000055d1c17e1000)
$ ./event
^CCaught an interrupt signal; exiting cleanly in two seconds.
done
查看 libevent-2.1.so.6 是否存在
$ cd /usr/local/lib
$ ll | grep libevent-2.1.so.6
lrwxrwxrwx. 1 root root 21 Apr 18 21:23 libevent-2.1.so.6 -> libevent-2.1.so.6.0.2
-rwxr-xr-x. 1 root root 1325512 Apr 18 21:23 libevent-2.1.so.6.0.2
lrwxrwxrwx. 1 root root 21 Apr 18 21:23 libevent.so -> libevent-2.1.so.6.0.2
系统显示已安装(注意,如果你安装libevent时,指定了自定义的路径--prefix=/usr/xxx
参数,结果是不一样的)。
映射
解决,映射 libevent-2.1.so.6 到 /lib64 路径中
sudo ln -s /usr/local/lib/libevent-2.1.so.6 /usr/lib64/libevent-2.1.so.6
本文libevent
版本为libevent-2.1.8-stable.tar.gz
,系统为centos7。
参考1
共享库(shared library)/动态库
共享库在程序编译时并不会被连接到目标代码中, 而是在程序运行是才被载入. 不同的应用程序如果调用相同的库, 那么在内存里只需要有一份该共享库的拷贝, 规避了空间浪费问题.动态库在程序运行时才被载入, 也解决了静态库对程序的更新、部署和发布会带来麻烦. 用户只需要更新动态库即可, 增量更新. 为什么需要动态库, 其实也是静态库的特点导致.
按照习惯, 一般以”.so”做为文件后缀名. 共享库的命名一般分为三个部分:
- 前缀:lib
- 库名称:自己定义即可, 如test
- 后缀:.so
所以最终的动态库的名字应该为:libtest.so
共享库的制作
- 生成目标文件.o, 此时要加编译选项:-fPIC(fpic)
gcc -fpic -c fun1.c fun2.c
参数:-fpic
创建与地址无关的编译程序(pic, position independent code), 目的就是为了能够在多个应用程序间共享.
- 生成共享库, 此时要加链接器选项:
-shared
(指定生成动态链接库)
gcc -shared fun1.o fun2.o -o libtest2.so
共享库的使用
共享库的使用
引用动态库编译成可执行文件(跟静态库方式一样):
用到的参数:
Ø -L
:指定要连接的库的所在目录
Ø -l
:指定链接时需要的动态库, 去掉前缀和后缀
Ø -I:
指定main.c文件用到的头文件head.h所在的路径
如何让系统找到共享库
Ø 拷贝自己制作的共享库到/lib或者/usr/lib
临时设置
Ø 临时设置LD_LIBRARY_PATH
:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库路径
永久设置方法一
Ø 永久设置, 把export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库路径
, 设置到∼/.bashrc
文件中
-
执行
. ~/.bashrc
使配置文件生效(第一个.
后面有一个空格) -
执行
source ~/.bashrc
配置文件生效 -
退出当前终端, 然后再次登陆也可以使配置文件生效
永久设置方法二
Ø 永久设置,把export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库路径
,设置到/etc/profile
文件中
永久设置方法三
Ø 永久设置,将其添加到 /etc/ld.so.cache
文件中
编辑/etc/ld.so.conf
文件, 加入库文件所在目录的路径
运行sudo ldconfig -v
, 该命令会重建/etc/ld.so.cache
文件
参考2
参考error while loading shared libraries: libevent-2.1.so.6 的解决办法