gcc与动态库链接,未定义引用错误

gcc与动态库链接,未定义引用错误,gcc,g++,shared-libraries,Gcc,G++,Shared Libraries,我正在制作一个需要链接到第三方SDK的程序,该SDK以头文件和预编译共享库的形式提供 程序本身很简单,它只调用库中的一个函数: #include <dhnetsdk.h> int main() { CLIENT_Init(nullptr, 0); } sdk/bin包含.so文件,sdk/include包含dhnetsdk.h文件,其中CLIENT_Init声明为extern“C”int CLIENT_Init(void(*)(long long,char*,long),

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

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

#include <dhnetsdk.h>

int main() {
    CLIENT_Init(nullptr, 0);
}
sdk/bin包含.so文件,sdk/include包含
dhnetsdk.h
文件,其中
CLIENT_Init
声明为
extern“C”int CLIENT_Init(void(*)(long long,char*,long),long)

我已使用
nm
和sdk/bin/libdhnetsdk进行了检查。因此确实导出了
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

我在这里做错了什么?

命令您提供要链接的库可能是错误的。例如,请参见以下答案:

现在,您可以尝试找出
-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

编辑:修复了源文件在库之前出现的问题。

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

该链接中的答案是五美元,但是10美元说,除非你一个接一个地尝试每个答案,或者已经知道问题所在,否则你不会在那里找到正确的答案。Darhuuuk可能是对的,这是命令。我一定要从那里开始。是的,这是点菜。将触发器/src/main.cpp
拖到开头。
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