Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 对符号的未定义引用,即使nm指示此符号存在于共享库中_Linux_Gcc_Linker_Shared Libraries - Fatal编程技术网

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

Linux 对符号的未定义引用,即使nm指示此符号存在于共享库中,linux,gcc,linker,shared-libraries,Linux,Gcc,Linker,Shared Libraries,这里可能出了什么问题?我有以下简单的类: #include "libmnl/libmnl.h" int main() { struct mnl_socket *a = mnl_socket_open(12); } 在运行一个简单的gcc编译(gcc-lmnlmain.c)之后,我得到以下错误: /tmp/cch3GjuS.o: In function `main': main.c:(.text+0xe): undefined reference to `mnl_socket_ope

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

#include  "libmnl/libmnl.h"

int main() {
    struct mnl_socket *a = mnl_socket_open(12);
}
在运行一个简单的
gcc
编译(
gcc-lmnlmain.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软件包。
gcc
strace
输出表明
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
移动到命令末尾。

谢谢,这很快。我想过去我“意外”在对象后面使用了-l,所以直到现在一切都很好。虽然这个问题帮助我解决了问题,但你能帮我找出你是如何知道你需要使用选项
-lmnl