当我使用
ldd
命令运行共享库(例如libphp5.so
)时,我看到它有一个对libmysqlclient.so.16
的依赖项:
$ ldd ./libphp5.so libmysqlclient.so.16 => /usr/lib/mysql/libmysqlclient.so.16 [其他依赖项已省略]
这些依赖项文件名和路径(/usr/lib/mysql/libmysqlclient.so.16
)是否嵌入到了共享库二进制文件中?或者这个路径是通过其他方式确定的,比如通过/etc/ld.so.conf.d/mysql-i386.conf
,该文件包含以下内容:
/usr/lib/mysql/
还有一件事让我感到困惑:
我有一个共享库,我从源代码编译而来。这个库依赖于 libmysqlclient_r
。gcc编译器用来生成这个库的开关看起来像:
gcc -shared -L/usr/lib/mysql -lmysqlclient_r [+各种其他开关]
当我执行 ldd mylib.so
时,我看到:
libmysqlclient_r.so.16 => /usr/lib/mysql/libmysqlclient_r.so.16 (0x0055c000)
然而在 /usr/lib/mysql
目录下,我看到:
-rwxr-xr-x. libmysqlclient_r.so -> libmysqlclient_r.so.16.0.0 lrwxrwxrwx. libmysqlclient_r.so.16 -> libmysqlclient_r.so.16.0.0 -rwxr-xr-x. libmysqlclient_r.so.16.0.0 lrwxrwxrwx. libmysqlclient.so -> libmysqlclient.so.16.0.0 lrwxrwxrwx. libmysqlclient.so.16 -> libmysqlclient.so.16.0.0 -rwxr-xr-x. libmysqlclient.so.16.0.0
libmysqlclient_r.so
是指向 libmysqlclient_r.so.16.0.0
的符号链接,那么为什么 ldd
显示依赖关系为 libmysqlclient_r.so.16
?我是否错过了一些黑科技?
作为一个多年的Windows开发人员,我对gcc和在Linux上进行开发还比较新。
我的Linux发行版是CentOS 6.0 x86-32bit。
libmysqlclient_r
,尽管它编译/构建得非常好。LD_DEBUG = libs ldd
是我的救命稻草。事实证明,在/etc/ld.co.conf.d
中保存的路径文件没有以.conf
结尾,而我的/etc/ld.so.conf
文件指定:include ld.so.conf.d/*.conf
。因此,/usr/lib/mysql
文件夹从未被搜索过。 - Kev