【问题标题】:Linker error: undefined reference to xxx after including .so lib链接器错误:包含 .so lib 后未定义对 xxx 的引用
【发布时间】:2020-02-11 07:23:30
【问题描述】:

在我的命令中明确使用 -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 文件就找到了!

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

【问题讨论】:

    标签: c++ g++ ld genicam


    【解决方案1】:

    找到问题了! 这是因为 IDS(cam vendor)提供了 api 修改后的共享对象,但修改了条目名称(与其中的 IDS 名称相同)...

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-08
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多