对“dlsym”的未定义引用
Posted
技术标签:
【中文标题】对“dlsym”的未定义引用【英文标题】:Undefined reference to 'dlsym' 【发布时间】:2013-12-20 14:28:55 【问题描述】:我看过很多类似的帖子,但尝试了书中的每一个技巧,但仍在苦苦挣扎。一切正常,但是在安装/删除带有一些组件/选择器的wireshark之后,一切都搞砸了。我不记得确切卸载了哪些库/包,但可能比我注意到的要多得多。
如果我创建一个像这样的简单 main.cpp 文件:
#include <SQLAPI.h>
int main()
SAConnection con;
return 0;
试试
g++ main.cpp -lsqlapi -ldl
它给了我以下错误信息:
/usr/local/lib/libsqlapi.so: undefined reference to `dlsym'
/usr/local/lib/libsqlapi.so: undefined reference to `dlerror'
/usr/local/lib/libsqlapi.so: undefined reference to `dlopen'
/usr/local/lib/libsqlapi.so: undefined reference to `dlclose'
collect2: error: ld returned 1 exit status
我尝试将 -ldl 放在 -lsqlapi 之前,因为有些人认为顺序很重要。如果我使用 gcc 而不是 g++,则错误是:
/usr/bin/ld: /tmp/ccwBI4tj.o: undefined reference to symbol '__gxx_personality_v0@@CXXABI_1.3'
/usr/lib/x86_64-linux-gnu/libstdc++.so.6: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
如果删除了 SAConnection,我可以编译和运行该文件。
我不认为它与 SQLAPI 有任何关系,因为我在使用 libboost 时遇到了类似的问题。我没有一个小的代码示例,但是当我编译一个上周成功编译的项目时,我得到了错误:
/usr/bin/ld: debug/components/helloworld/HelloWorld.o: undefined reference to symbol '_ZN5boost6system15system_categoryEv'
/usr/lib/x86_64-linux-gnu/libboost_system.so.1.53.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
这个项目使用的 Makefile 没有改变,所以它在我的系统上一定是不正确的。我已尝试重新安装 build-essential。
使用 Ubuntu 64 位 13.10 和 g++ 版本 4.8.1。
【问题讨论】:
【参考方案1】:我找到了解决办法;在-ldl
之前设置-Wl,--no-as-needed
。新的编译命令是:
gcc main.cpp -lsqlapi -lstdc++ -Wl,--no-as-needed -ldl
显然它与最近版本的 gcc/ld 默认链接 --as-needed
有关。
【讨论】:
以上是关于对“dlsym”的未定义引用的主要内容,如果未能解决你的问题,请参考以下文章