【问题标题】:Undefined reference to 'dlsym' and 'dlopen'对“dlsym”和“dlopen”的未定义引用
【发布时间】:2015-02-20 19:32:51
【问题描述】:

我正在使用 arm-linux-gnueabi-g++ 版本 4.7.3 进行编译。

我在以下位置安装了 arm-linux-gnueabi 库:

/usr/arm-linux-gnueabi/lib,它包含libdl.a、libdl.so、libdl.so.2、 和 libdl-2.19.so。

libdl.so 链接到 libdl.so.2,而 libdl.so.2 链接到 libdl-2.19.so。

我正在尝试链接 dl 库(请参阅下面的命令字符串),但我总是收到未定义的引用错误。

arm-linux-gnueabi-g++ -I. -I../ -I../Comms/Linux  -Wall -DLINUX -fpic -o ../../work/MyProgram main.o
-L../../work -L/usr/arm-linux-gnueabi/lib -lComms -lConsole -lUtilities -ldl
../../work/libUtilities.so: undefined reference to `dlsym'
../../work/libUtilities.so: undefined reference to `dlopen'
collect2: error: ld returned 1 exit status

如果我使用以下命令使用 g++ 4.8.2 进行编译,那么我的程序可以正常编译、链接和执行。

g++ -I. -I../ -I../Comms/Linux  -Wall -DLINUX -fpic -o ../../work/MyProgram main.o
-L../../work -lComms -lConsole -lUtilities -ldl

显然它找不到 libdl.so 库;我认为通过使用-L 标志将路径添加到相应库的位置可以解决问题,但它没有。

ARM 编译器命令缺少什么?

【问题讨论】:

标签: c++ linux arm shared-libraries undefined-reference


【解决方案1】:

好吧,我找到了答案,我需要在 -ldl 之前使用 -Wl,--no-as-needed 标志。在我问这个问题之前,我遇到过这个标志,但显然打错了,因为它对我没有用。

我不明白为什么需要该标志,但代码现在确实完成了链接。

一个 SO 用户 here 说它与链接到 --as-needed 的 gcc 的最新版本(截至用户帖子的 2013 年)有关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多