【问题标题】:undefined reference to symbol even when nm indicates that this symbol is present in the shared library即使 nm 指示此符号存在于共享库中,对符号的未定义引用
【发布时间】:2012-05-14 10:56:11
【问题描述】:

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

#include  "libmnl/libmnl.h"

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

在运行一个简单的gcc compile (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-devlibmnl0 软件包已安装。 gccstrace 输出表明 ld 正在使用该 *.so 文件:

[pid 10988] stat("/usr/lib/gcc/x86_64-linux-gnu/4.6/libmnl.so", 0x7fff2a39b470) = -1 ENOENT (No such file or directory)
[pid 10988] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/libmnl.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 10988] stat("/usr/lib/gcc/x86_64-linux-gnu/4.6/libmnl.a", 0x7fff2a39b4d0) = -1 ENOENT (No such file or directory)
[pid 10988] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/libmnl.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 10988] stat("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libmnl.so", 0x7fff2a39b470) = -1 ENOENT (No such file or directory)
[pid 10988] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libmnl.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 10988] stat("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libmnl.a", 0x7fff2a39b4d0) = -1 ENOENT (No such file or directory)
[pid 10988] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/libmnl.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 10988] stat("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libmnl.so", {st_mode=S_IFREG|0644, st_size=18608, ...}) = 0
[pid 10988] open("/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../../lib/libmnl.so", O_RDONLY) = 7

【问题讨论】:

  • 虽然这个问题帮助我解决了我的问题,但请你帮我看看你是怎么知道你需要使用-lmnl这个选项的?

标签: linux gcc linker shared-libraries


【解决方案1】:

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

【讨论】:

  • 谢谢,这很快。我想过去我“不小心”在对象之后使用了 -l,所以到目前为止一切正常。
猜你喜欢
  • 2021-07-22
  • 2011-02-28
  • 2016-10-16
  • 1970-01-01
  • 2011-07-19
  • 2011-01-20
  • 2018-04-14
  • 2020-07-22
  • 2021-08-20
相关资源
最近更新 更多