我正在尝试使用gcc / libtool链接AIX 5.3上的共享库(apr)。
编译器的输出如下(为简单起见,删除了一些不相关的标志):
libtool: link: gcc -o test test.o -L/opt/freeware/lib -lapr-1 -lpthread -Wl,-blibpath:/opt/freeware lib:/usr/lib:/lib
然后我检查了生成的二进制文件使用的共享库:
$ ldd test
test needs:
/usr/lib/libc.a(shr.o)
/usr/lib/libpthread.a(shr_xpg5.o)
/unix
/usr/lib/libcrypt.a(shr.o)
/usr/lib/libpthreads.a(shr_comm.o)
请注意,此处缺少'libapr-1',尽管二进制文件中存在符号(用nm验证),这表明它是静态链接的。
对于简单的程序来说,这不是一个大问题。不幸的是,我的代码使用动态可加载模块。主程序调用apr_initialize,它在库中设置一个静态变量'apr_pools_initialized'。然后可加载模块尝试使用apr_pool_create,首先检查是否已执行初始化。由于它们有自己的静态链接apr,因此静态变量'apr_pools_initialized'与主程序初始化的内存位置不同。这使得静态链接的二进制文件无法正常工作。
使用预编译的二进制rpm(apr和apr-devel)安装apr库。相关的库文件在那里:
# rpm -ql apr|grep \\.so$
/opt/freeware/lib/libapr-1.so
/opt/freeware/lib64/libapr-1.so
/usr/lib/libapr-1.so
# rpm -ql apr-devel|grep \\.a$
/opt/freeware/lib/libapr-1.a
/opt/freeware/lib64/libapr-1.a
/usr/lib/libapr-1.a
/usr/lib64/libapr-1.a
/usr/lib64/libapr-1.so
我试图删除'.a'文件,希望链接器别无选择,只能使用'.so'并动态链接它,遗憾的是AIX不同,这不起作用。 关于这个主题,我发现this回答和another libtool question给出了一些见解。
问题是:如何动态地将其与我的二进制文件相关联?
答案 0 :(得分:0)
实际上引用的链接包含此问题的解决方案,即:
-Wl,-brtl
添加这些LDFLAGS解决了链接问题。