gcc与动态库链接,未定义参考错误

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

我正在制作一个需要链接到第三方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

我在这里做错了什么?

c++ gcc g++ shared-libraries
1个回答
0
投票

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

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

g++ -std=c++17 -O3 -Lsdk/bin -Isdk/include \
  -Wl,--start-group -ldhnetsdk -lavnetsdk -ldhconfigsdk -lInfra \
    -lNetFramework -lStream -lStreamSvr -Wl,--end-group \
  trigger/src/main.cpp
© www.soinside.com 2019 - 2024. All rights reserved.