未定义对“dlsym”的引用

问题描述 投票:0回答:1

我看过很多类似的帖子,但尝试了书中的每一个技巧,但仍然在挣扎。一切都工作正常,但是在使用一些组件/取消器安装/删除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。

c++ gcc compiler-errors ubuntu-13.10
1个回答
63
投票

我找到了解决办法;在

-Wl,--no-as-needed
之前将
-ldl
标志传递给 ld。新的编译命令是:

gcc main.cpp -lsqlapi -lstdc++ -Wl,--no-as-needed -ldl

显然这与默认情况下与

--as-needed
链接的最新版本的 gcc/ld 有关。

© www.soinside.com 2019 - 2024. All rights reserved.