Monday, October 5, 2009

动态链接库

多人使用的发行版本就是方便. 下个bin就可以使用. 比如chromium有deb包的.
今天懒了, 想下载个bin版本的mysql-gui-tools用. 结果给我报了个Error:
jessinio@niolaptop /tmp/mysql-gui-tools-5.0 $ ./mysql-administrator-bin
./mysql-administrator-bin: error while loading shared libraries: libpcre.so.3: cannot open shared object file: No such file or directory    

这其实就是dynamic share library的问题. 因为下载的binary文件中包括了需要使用的动态链接库的绝对路径. 三个问题:
1. 我的gentoo的动态链接库放在哪里呢?
2. 我的gentoo有没有安装这个library呢?
3. 怎么得知这个二进制文件中需要使用的动态链接库的绝对路径呢?

还有一个是不希望出现的问题: 动态链接库的版本问题. 出这个问题还不如干脆自己emerge一个.

对于第一个问题: 哪里放library文件的呢?
linux下没有强制, 只有约定! 一般放在下面的文件夹中:
1. /lib
2. /usr/lib
3. /usr/local/lib

随便看到两个比较有意思的文夹:
1. /usr/local/libexec
2. /usr/libexec
* 文档是这样描述这两个文件夹的用法的: Note that if your library calls programs that can only be called via
libraries, you should place those programs in /usr/local/libexec
这两个文件夹下的文件说白了就是可运行的程序! 只不是我们说常用的CLI. 而是只为了给API调用的程序

第二个问题: 我的gentoo有没有安装这个library呢?
在上面的基础上:
jessinio@niolaptop ~$ find /lib/ /usr/lib /usr/local/lib -name "*pcre*"

可以轻松出来:
/lib/libpcre.so.0
/lib/libpcre.so.0.0.1

可知道没有名叫: libpcre.so.3 的文件, 应该为找到的/lib/libpcre.so.0创建一个link文件(这其实是so文件的命名方式). 问题是这个link文件应该放在哪里才会被运行的程序使用呢? 这就来了第三个问题: 怎么得知这个二进制文件中需要使用的动态链接库的绝对路径呢?

jessinio@niolaptop /tmp/mysql-gui-tools-5.0 $ ldd mysql-administrator-bin |grep pcre
        libpcre.so.3 => /lib/libpcre.so.3 (0xb7261000)
这就被强大的ldd命令挖出来了, 创建一个link文件:
jessinio@niolaptop /tmp/mysql-gui-tools-5.0 $ sudo ln -s /lib/libpcre.so.0.0.1 /lib/libpcre.so.3

这就解决了下载的binrary文件在gentoo下的运行问题. 当然, 不是万能的! 要根据实际问题找解决方法. gentoo下有时间还是emerge(至少make)一个binrary!

于关dynamic share library的文档: http://www.linux.org/docs/ldp/howto/Program-Library-HOWTO/shared-libraries.html

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.