未定义的符号引用,即使nm表示此符号存在于共享库中

时间:2012-05-04 21:50:58

标签: linux gcc linker shared-libraries

这里有什么问题?我有以下简单的类:

#include  "libmnl/libmnl.h"

int main() {
    struct mnl_socket *a = mnl_socket_open(12);
}

运行简单的gcc编译(gcc -lmnl main.c)后,我收到以下错误:

/tmp/cch3GjuS.o: In function `main':
main.c:(.text+0xe): undefined reference to `mnl_socket_open'
collect2: ld returned 1 exit status

在共享库上运行nm表明它实际上已找到:

aatteka@aatteka-Dell1:/tmp$ nm -D /usr/lib/libmnl.so | grep mnl_socket_open
0000000000001810 T mnl_socket_open

这是在Ubuntu 12.04上发生的。安装了 libmnl-dev libmnl0 软件包。 strace的{​​{1}}输出表明gcc正在使用* .so文件:

ld

1 个答案:

答案 0 :(得分:37)

必须在使用它们的对象之后列出库(更确切地说,只有当库包含满足遇到未知定义的未定义引用的符号时才会使用库)。将-lmnl移动到命令的末尾。