【问题标题】:gcc linking with dynamic libraries, undefined reference errorgcc 与动态库链接,未定义的引用错误
【发布时间】:2020-03-18 16:15:08
【问题描述】:

我正在制作一个需要链接到第三方 SDK 的程序,该 SDK 以头文件和预编译共享库的形式出现。

程序本身很简单,它只是从库中调用一个函数:

#include <dhnetsdk.h>

int main() {
    CLIENT_Init(nullptr, 0);
}

然后我编译它

g++ -std=c++17 -O3 -ldhnetsdk -lavnetsdk -ldhconfigsdk -lInfra -lNetFramework -lStream -lStreamSvr trigger/src/main.cpp -Lsdk/bin -Isdk/include

sdk/bin 包含 .so 文件,sdk/include 包含 dhnetsdk.h 文件,其中 CLIENT_Init 被声明为 extern "C" int CLIENT_Init(void(*)(long long, char*, long), long);

我检查了nm 和 sdk/bin/libdhnetsdk.so 确实导出了CLIENT_Init 符号,但由于某种原因,链接器无法找到它并失败:

/usr/bin/ld: /tmp/ccovgfxa.o: in function `main':
main.cpp:(.text.startup+0x9): undefined reference to `CLIENT_Init'
collect2: error: ld returned 1 exit status

我在这里做错了什么?

【问题讨论】:

  • 5 美元表示该链接中的答案,但 10 美元表示除非您逐个尝试每个答案或已经知道问题所在,否则您将无法在其中找到正确答案。 Darhuuuk 可能是对的,它正在订购。我肯定会从那里开始。
  • 是的,它正在订购。将trigger/src/main.cpp 拖到开头。

标签: gcc g++ shared-libraries


【解决方案1】:

最后我发现这都是关于排序的,我需要将 src/trigger/main.cpp 放在所有解决问题的库之前。

【讨论】:

    【解决方案2】:

    命令您提供要链接的库可能是错误的。参见例如这个答案:https://stackoverflow.com/a/24675715

    现在,您可以尝试找出-l 参数的顺序。或者让ld 通过创建一组库来找出它。 ld 将在该组中搜索,直到找到必要的功能(或确定它不可用)。您可以使用ld--start-group--end-group 选项来执行此操作:

    g++ -std=c++17 -O3 -Lsdk/bin -Isdk/include trigger/src/main.cpp \
      -Wl,--start-group -ldhnetsdk -lavnetsdk -ldhconfigsdk -lInfra \
        -lNetFramework -lStream -lStreamSvr -Wl,--end-group
    

    编辑: 已修复,因此源文件位于库之前。

    【讨论】:

      猜你喜欢
      • 2013-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-04
      • 1970-01-01
      • 2012-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多