安装 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 就可以了。