链接器错误:在包含 .so lib 后未定义对 xxx 的引用

Linker error: undefined reference to xxx after including .so lib

本文关键字:未定义 xxx 引用 lib so 错误 包含 链接      更新时间:2023-10-16

在我的命令中明确使用 -lmylib 和 -LmyPath 的未定义引用事件。

我正在尝试使用genicam API编译一个测试程序。此 API 为 linux 提供了包含所有所需定义的共享库。 我的命令如下:

g++ -L/lib -lrt -ldl -Wl,-E -pthread -o mytest <some .o files>  
-lFirmwareUpdate_gcc49_v3_1_IDS -llog4cpp_gcc49_v3_1_IDS 
-lGCBase_gcc49_v3_1_IDS -lLog_gcc49_v3_1_IDS -lMathParser_gcc49_v3_1_IDS 
-lNodeMapData_gcc49_v3_1_IDS -lXmlParser_gcc49_v3_1_IDS 
-lGenApi_gcc49_v3_1_IDS

程序编译,但根据链接器,所有应该在 .so 文件中定义的引用都是未定义的,例如:

/usr/bin/ld: <my.o>: in function <myObject>::setTriggerMode(char const*):
my.cpp:271: undefined reference to GenICam_3_1::gcstring::gcstring(char const*)'

我试图查看库的内部,并保持相同的示例:

nm -D /lib/libGCBase_gcc49_v3_1_IDS.so | grep -i gcstring
000000000000c400 T _ZN15GenICam_3_1_IDS8gcstringC1Emc

这条线不是唯一的输出线,但似乎 gcstring 在那里是完全定义的......

所以,我试图知道 ld 是否在取笑我,并使用 strace (-f( 再次运行我的编译命令。 ld 真的打开了好的 .so 文件并找到了它!

谢谢你的帮助,我不知道会发生什么。

发现问题! 这是因为 IDS(凸轮供应商(提供了 API 修改的共享对象,但具有修改的条目名称(与 IDS 相同的名称(......

从 github 获得了真正的库,它可以工作!