我正在制作一个需要链接到第三方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
我在这里做错了什么?
为了命令您提供要链接的库,可能是错误的。参见例如此答案: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