dlopen中对__dlopen的未知引用

时间:2011-09-23 08:31:24

标签: c++ linux shared-libraries

dlopen位于libdl.a但是当我将我的应用程序与libdl.a相关联时,gcc链接器会抛出此错误:unknow reference to __dlopen called in dlopen

我应该导入另一个.a吗?

2 个答案:

答案 0 :(得分:8)

当我尝试静态编译dlopen模型程序时,gcc(Archlinux / gcc版本4.6.1 20110819(预发行版))告诉我:

$ gcc test.c  -ldl -static  
/tmp/ccsWe4RN.o: In function `main': test.c:(.text+0x13): 
warning: Using 'dlopen' in statically linked applications requires 
at runtime the shared libraries from the glibc version used for linking

确实,当我在/usr/lib/

中运行此脚本时
for i in *.a; 
do 
    echo $i; 
    readelf -a $i | grep __dlopen;
done

我看到了:

libc.a
16: 0000000000000080    69 FUNC    GLOBAL DEFAULT    1 __dlopen
000000000000  002300000001 R_X86_64_64       0000000000000000 __dlopen + 0
35: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND __dlopen

因此,根据第一行,libc.a确定了您丢失的符号。

在我的系统中,gcc test.c -ldl -static足以让应用程序运行,但

gcc <file> -static -ldl -lc

应解决系统中的问题。

答案 1 :(得分:3)

您应该可以将共享库libdl.so

一起使用
gcc -ldl ...

如果您对使用静态版本没有强烈要求。