libsvn_subr-1.so.0: undefined symbol: sqlite3_open_v2

安装 subversion 到 CentOS 服务器上,编译了 OpenSSL、Apache 和 SQLite,subversion 也编译完了,用 httpd -t 查看 Apache 配置文件的时候报出错误:

httpd: Syntax error on line 106 of /xxx/yyy/apache2/conf/httpd.conf: Cannot load /xxx/yyy/apache2/modules/mod_dav_svn.so into server: /xxx/yyy/subversion/lib/libsvn_subr-1.so.0: undefined symbol: sqlite3_open_v2

一下就晕了,在 Google 查不到几条信息,也都没说到点上,不过还算有些启发。

之前在本地 VMware 的 CentOS 上测试过,安装很顺利,这回失败,肯定跟 64 位服务器有关。

换了多种 subversion 的编译参数,反复编译了几次,问题依旧。

后来学会了用 ldd 查看链接库的依赖:

shell> ldd /xxx/yyy/subversion/lib/libsvn_subr-1.so.0

libaprutil-1.so.0 => /xxx/yyy/apr-util/lib/libaprutil-1.so.0 (0x00002b4613bf5000)

libexpat.so.0 => /lib64/libexpat.so.0 (0x00002b4613e22000)

libapr-1.so.0 => /usr/lib64/libapr-1.so.0 (0x00002b4614044000)

libuuid.so.1 => /lib64/libuuid.so.1 (0x00002b461426c000)

librt.so.1 => /lib64/librt.so.1 (0x00002b4614470000)

libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00002b4614679000)

libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b46148b2000)

libdl.so.2 => /lib64/libdl.so.2 (0x00002b4614acd000)

libsqlite3.so.0 => /usr/lib64/libsqlite3.so.0 (0x00002b4614cd1000)

libc.so.6 => /lib64/libc.so.6 (0x00002b4614f2c000)

/lib64/ld-linux-x86-64.so.2 (0x00002b461376e000)

看到 libsqlite3.so.0 依赖的是用的系统自带的 64 位的 sqlite 链接库,这个链接库应该是没有定义 “sqlite3_open_v2”,因此 mod_dav_svn.so 是无法加载到 apache 中的。

虽然找到了有价值的线索,但让我开始更为迷惑,为什么 libsvn_subr-1.so.0 会依赖系统的库文件,不是我指定的 sqlite 的库文件地址呢?

又查看了 subversion 源码中附带的 INSTALL 说明文件,文中提及了 sqlite 的 3 种关联方式。

我指定了 sqlite 的安装路径,是第 1 种方式,但应该是使用 32 位方式编译的(不知道怎么设置强制 64 位编译),subversion 会忽略。

文中的第 2 种方式,把 sqlite3.c 复制到 subversion 的源码路径下:

/xxx/yyy/src/subversion-1.6.5/sqlite-amalgamation/sqlite3.c

然后重新编译,完成后再看 libsvn_subr-1.so.0 的依赖,发现它已经不再依赖外部 sqlite 。

这样 subversion 的安装问题就解决了。

顺便再记录一下 64 位系统中安装其他软件时遇到的问题如何解决。

安装 apache 需要 zlib 和 openssl,如果用普通方式编译这 2 个软件,则 apache 编译出错:

“relocation R_X86_64_32 against `a local symbol’ can not be used when making a shared object; recompile with -fPIC”

解决问题的方法,是在这 2 个软件进行 configure 之后,修改 Makefile 文件,找到 CFLAGS,加上 -fPIC 参数,如下:

CFLAGS=”-O3 -fPIC”

注意,这只是个例子,可能参数列表不一样,只要加入 -fPIC 就可以了。

Tags: ,

Leave a Reply

Your email address will not be published.

*