当我ldd
针对一个共享库运行时,例如libphp5.so
我看到它依赖于libmysqlclient.so.16
:
$ ldd ./libphp5.so libmysqlclient.so.16 => /usr/lib/mysql/libmysqlclient.so.16 [其他依赖项被剪掉]
这些依赖文件名和路径 ( /usr/lib/mysql/libmysqlclient.so.16
) 是否已包含在共享库二进制文件中?或者这条路径是由其他方式确定的,例如 via /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。