我在另一个库libmsg中使用了一个名为liblogger的日志库(我已经实现了) 。对于他们两个,我都在使用自动工具。我在我的系统中成功安装了 liblogger 库,位于 /usr/local/lib 目录下。
在另一个libmsg的 configure.ac 脚本中,我验证 liblogger 已安装在系统中,如下所示:
AC_CHECK_LIB([logger],
[log_init],
[],
[
echo "Error: Could not find liblogger."
exit 1
])
并将“-L/usr/local/lib”路径添加到 LDFLAGS 变量。
AC_CHECK_LIB 测试找到该库,并且libmsg库及其使用的 check_PROGRAMS 均已成功编译。
但是,当我尝试执行测试程序时,出现错误:
加载共享库时出错:liblogger.so.0:无法打开共享对象文件:没有这样的文件或目录
实际上,ldd也找不到该库:
$ ldd msgs
linux-vdso.so.1 => (0x00007fff543ff000)
liblogger.so.0 => not found
libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007fdf329ad000)
但图书馆实际上就在那里,在/usr/local/lib。
为了链接测试程序,使用以下指令调用 libtool:
$ /bin/bash ../libtool --tag=CC --mode=link gcc -I../include -I../msg -L/usr/local/lib -O2 -Wall -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/local/include -I/usr/local/lib -L/usr/local/lib -o msgs msgs.o message.o base64.o misc.o -llogger -lglib-2.0
这实际上与以下内容相呼应:
libtool: link: gcc -I../include -I../msg -O2 -Wall -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/local/include -I/usr/local/lib -o msgs msgs.o message.o base64.o misc.o -L/usr/local/lib /usr/local/lib/liblogger.so -lglib-2.0
所以,-llogger标志被-L[..] /usr/local/liblogger.so取代(我想这是一个正确的行为?我还不能确定它......)
实际上,如果我用以下方式调用测试程序:
LDPRELOAD=/usr/local/lib/liblogger.so 消息
它确实有效。
谁能告诉我我错过了什么?