libmysqlclient.so.15: cannot open shared object file: No such file or directory

转载 2009年06月02日 16:11:00

原贴:http://soho-schubert.blogspot.com/2007/08/linux.html

Linux编程使用库

昨天写了一小段测试MySQL的C代码,编译顺利,但运行时报告找不到库,系统是FC4,MySQL是直接下载的Binary:
# gcc test_mysql.c -o test_mysql -L/usr/local/mysql/lib -lmysqlclient
#./test_mysql: error while loading shared libraries:
libmysqlclient.so.15: cannot open shared object file: No such file or directory

虽然知道这一定是系统没有找到加载libmysqlclient.so库的路径,并且可以把libmysqlclient.so.15 copy到/usr/lib解决,但不知道该原理和更好的方法。于是重看GUN/Linux编程指南(Kurt Wall)第10章,答案如下。

运行时使用非标准位置/usr/lib和/lib下的库的方式有三种:
(1) 设置$LD_LIBRARY_PATH=库所在目录(多个目录用:分隔),系统加载工具ld.so/ld-linux.so将顺序搜索变量指定的目录。例如#$LD_LIBRARY_PATH=/usr/local/mysql/lib ./test_mysql
(2) 以root身份把库路径加入/etc/ld.so.conf或在/etc/ld.so.conf.d中创建特定的.conf文件,然后运行ldconfig更新/etc/ld.so.cache。例如:在/etc/ld.so.conf.d下创建文件mysql.conf写入/usr/local/mysql/lib
(3) 另一种办法就是把需要的库copy到/usr/lib或/lib,但这不是建议的方法,特别是尽量避免copy发到/lib。但这种方法可以在编译时免去用-L选项。

共享库搜索顺序一般是$LDLIBRARY_PATH,/etc/ld.so.cache, /usr/lib, /lib

========
另外,顺便温习了一下其它和库相关的基础知识:

库的目的是代码重用,提供共用的功能,某个程序为别的程序提供公开的接口等。

命名和编号:
(1) 所有库名以lib开头,gcc在-l指定的文件名前自动插入lib,如libmysqlclient就用-lmysqlclient
(2) .a是静态库(archive),如 libmysqlclient.a
(3) .so是共享库(shared object),如libmysqlclient.so
(4) 编号格式:library_name.major_num.minor_num.patch_num,如libmysqlclient.so.15.0.0
(5) _g和_p: /usr/lib/libform_g.a 中的_g表示这是libform.a的调试库,用locate _g.a会发现很多类似的库,但我用locate _g.so没有发现FC4有此类库;libxxx_p.a中的_p表示这是libxxx.a的性能分析库(profiling),但我用locate _p.a和locate _p.so没有发现FC4有此类路库。

库要和接口头文件配合使用,常见的库如:
libc.so (不需头文件) 标准C库
libdl.so (dlfcn.h) 让程序在运行是加载和使用库代码,而不在编译时链接库
libglib.so (glib.h) Glib工具函数,例如hash, string等
libgthread.so (glib.h) 对Glib的线程支持
libm.so (math.h) 标准C数学库
libpthread.so (pthread.h) POSIX标准Linux线程库
libz.so (zlib.h) 通用压缩程序库

库操作命令:
(1) nm 列出目标文件或二进制文件的所有符号
(2) ar 创建静态库和符号索引
(3) ldd 列出程序正常运行所需要的共享库,例如
# ldd test_mysql
linux-gate.so.1 => (0x00c59000)
libmysqlclient.so.15 => /lib/libmysqlclient.so.15 (0x009a1000)
libc.so.6 => /lib/libc.so.6 (0x0038b000)
libpthread.so.0 => /lib/libpthread.so.0 (0x004f8000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0x002f0000)
libnsl.so.1 => /lib/libnsl.so.1 (0x00320000)
libm.so.6 => /lib/libm.so.6 (0x004bd000)
/lib/ld-linux.so.2 (0x0036d000)
(4) ldconfig 和动态链接和装载工具ld.so/ld-linux.so一起决定位于/usr/lib和/lib下的so库所需的链接。ldconfig创建一个从实际库到so库名的符号链接。注意/etc/ld.so.cache, /etc/ld.so.conf ldconfig -p列出/etc/ld.so.cache内的库对照链接。

环境变量:
动态链接器ld.so/ld-linux.so使用一些环境变量:
$LDLIBRARY_PATH : 格式类似$PATH,:分隔,非标准位置/usr/lib和/lib下的库或者/etc/ld.so.cache中没有的库,需要加入该变量才能被搜索到。
$LD_PRELOAD: 空格分隔,定义需要在最前面加载的库。也可以由/etc/ld.so.preload文件代替

静态库和共享库都是包含object文件的文件。

建立和使用静态库:
(1) 把代码编译成目标文件,如gcc -c libxxx.c -o libxxx.o
(2) ar: ar -rcs linxxx.a linxxx.o
(3) gcc -static: gcc test.c -o test -static -L. -lxxx
(4) 用file检查静态链接的可执行文件
(5) 用nm检查符号,静态链接没有未定义符号

共享库占用系统资源少(磁盘和内存),运行时根据共享链接从单个文件加载,速度快,维护方便。在运行时,ld.so/ld-linux.so把二进制文件中的符号名链接到适当的so库上。

建立和使用共享库:
(1) gcc -fPIC 产生与位置无关的代码,如gcc -fPIC -g -c libxxx.c -o libxxx.o
(2) gcc -shared和-soname,如gcc -g -shared -Wl,–soname, -libxxx.so -o libxxx.so.1.0.0 libxxx.o (注意-Wl,–soname, -libxxx.so 中间没有空格)
(3) gcc -Wl 把参数传递给链接器ld
(4) gcc -l显式链接C库

编译时指定非标准位置/usr/lib和/lib下的库的方式是用-L库目录指定。

libmysqlclient.so.16: cannot open shared object file: No such file or directory

查看有没有装libmysqlclient.so.16:find / -name libmysqlclient.so.16 如果装了,就 ln -s /usr/local/mysql/lib/m...
  • red10057
  • red10057
  • 2012年06月15日 19:11
  • 14914

Nagios监控mysql从库报错: libmysqlclient.so.18: cannot open shared object file: No such

做mysql的slave监控的时候,需要check_mysql脚本,check的时候报错: error while loading shared libraries: libmysqlclient.s...
  • mchdba
  • mchdba
  • 2014年05月14日 18:48
  • 8634

libmysqlclient.so.15: cannot open shared object file: No such file or directory

一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误, 比如: tmux: error while loading shared libraries: libevent-...
  • hanfazy
  • hanfazy
  • 2014年01月16日 13:41
  • 660

遇到了ImportError: libmysqlclient_r.so.16: cannot open shared object file: No such file or directory

在linux上运行程序的时候,发现有这个异常: Traceback (most recent call last):   File "rcctestsuite.py", line 13, in   ...
  • hebeiqiaozhonghui
  • hebeiqiaozhonghui
  • 2017年12月08日 13:16
  • 43

libmysqlclient.so.18: cannot open shared object file: No such file or directory

错误情形:[root@localhost ~]# /usr/local/nagios/libexec/check_mysql -h /usr/local/nagios/libexec/check_my...
  • u014236541
  • u014236541
  • 2015年03月26日 17:15
  • 4637

./server: error while loading shared libraries: libzmq.so.1: cannot open shared object file: No such

./server: error while loading shared libraries: libzmq.so.1: cannot open shared object file: No such...
  • guoyilongedu
  • guoyilongedu
  • 2013年12月23日 10:17
  • 7051

解决libmysql.so.16: cannot open shared object file

文章解决的问题:安装nginx中需要libmysql.so.16包的支持,下面介绍如何安装,并建立lib的连接。 问题展示:error while loading shared libraries: ...
  • tool163
  • tool163
  • 2013年08月03日 13:30
  • 4210

libmysqlclient.so.18: cannot open shared object file: No such file or directory

前言: 在CentOS上写代码,安装了mysql之后,虽然mysql相关编程所需的库都安装好了,但是系统找不到,所以报这个错误。 解决方案: 添加  /usr/local/mysql/lib  到...
  • shine_journey
  • shine_journey
  • 2017年04月08日 18:02
  • 443

fedora20 执行 arm-linux-gcc 出现 libz.so.1: cannot open shared object file问题解决方案

6. 编译测试代码 arm-linux-gcc -o test test.c 错误提示: /opt/FriendlyARM/tools/arm-linux-gcc-4.5.1/bin...
  • g457499940
  • g457499940
  • 2014年08月21日 00:34
  • 8959

安装libjpeg库后提示libjpeg.so.8不存在(linux环境)

作为一个小白,Python3的第一个练手项目是写一个爬虫,需要处理验证码,所以用了Pillow模块。 程序写好后,在本地的Windows上用得好好的,但移植到云服务器 (centos)却出了问题,...
  • cxq2046
  • cxq2046
  • 2015年12月10日 20:09
  • 3069
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:libmysqlclient.so.15: cannot open shared object file: No such file or directory
举报原因:
原因补充:

(最多只允许输入30个字)