当前位置: 首页 > 面试题库 >

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

雷锋
2023-03-14
问题内容

这有什么问题吗?我有以下简单的课程:

#include  "libmnl/libmnl.h"

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

在运行一个简单的gcccompile(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输出gcc表明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命令末尾。



 类似资料:
  • 问题内容: 两个共享库liba.so和libb.so。liba.so使用libb.so。所有c文件都使用-fPIC编译。链接使用- shared。当我们在liba.so上调用dlopen时,它无法在libb.so中找到符号…我们得到“未定义符号”错误。我们可以dlopen libb.so没有错误。我们知道liba正在找到libb,因为我们没有得到文件未找到错误。删除libb.so时,出现文件未找到

  • 如有任何线索将不胜感激。 换了cmakelists后我又遇到了一个问题

  • 我试图加载一个. so文件(libInfExprParser.so)使用JNI。我没有这个共享对象的源代码。我得到以下错误: 线程“main”java中出现异常。lang.unsatifiedlinkerror:/home/tomcat/sahiti/ExprParser/libinfexparser。所以:/home/tomcat/sahiti/ExprParser/libinexprparse

  • 以下是不同的Makefile: libcds/src: SSA2: (std::basic_ostream>&,char const*,int)U std::__throw_bad_cast() U std::cout 所以实际上这可能与链接器错误有关:未定义对`std::ctype ::_m_widen_init()的引用

  • 问题内容: 我有一个使用ES6标准编写的应用程序,并且用于构建它。使用加载模块。具体来说,我使用以下版本的软件包: 但是,在构建它之后,IE 10会出现以下错误。难道不应该定义吗?是否有任何特定的配置,或者我需要进行设置才能使其正常工作?我在中使用配置。 任何帮助,将不胜感激,谢谢! 问题答案: 好的,我最终发现仅此一项并不能实现polyfill。包括脚本为我解决了这个问题。

  • 问题内容: 我正在制作一个C ++共享库,当我编译使用该库的主exe时,编译器会给出以下信息: 库代码: fooclass.h fooclass.cpp 编译: 主要:main.cpp 编译: 该机器是Ubuntu Linux 12 谢谢! 问题答案: 是问题。最新版本的GCC要求您按照相互依赖的顺序放置目标文件和库-因此,根据经验法则,必须将库标志作为链接器的最后一个开关;即写 代替。