【问题标题】:Linking against so library without header files via objdump通过 objdump 链接到没有头文件的 so 库
【发布时间】:2011-12-15 14:50:56
【问题描述】:

所以我有一个没有头文件的 .so 文件,我想编译代码和链接(长篇大论)

不管怎样,我得到了 objdump 来输出去错头文件

objdump -g -x -C libglo_crc.so

我得到这样的结果:

long int Calculate_Message_CRC__FUcPUc (int iLength /* 0x8 */, unsigned char *iMess /* 0xc */)

所以我知道这是错误的名称,我创建了一个这样的原型:

long int Calculate_Message_CRC(unsigned char, unsigned char *);

然后尝试调用 Calculate_Message_CRC 函数,但我总是以未定义的引用错误结束:

g++ test.cpp -L. -l glo_crc
undefined reference to `Calculate_Message_CRC(unsigned char, unsigned char*)'

我做错了吗?如果没有供应商提供的标头,我还能如何链接到这个库?

【问题讨论】:

  • 您确定您正确复制了解构名称和原型的签名吗?如果是,那么你的原型与函数不匹配,因为它的第一个参数是int 而不是unsigned char
  • 看起来第一个参数是 int 而不是 char。
  • 我尝试了 int 和 unsigned char,都没有成功。
  • -C 不应该解散吗?你确定这个库是用同一个编译器编译的吗?

标签: c++ header shared-libraries objdump


【解决方案1】:
  • 如前所述,检查第一个参数,它必须是int,而不是usigned char。
  • 我在您的问题中看到了objdump -g -x -C libglo_bc.so,但您链接的是glo_crc (-l glo_crc)。为什么?编译器将搜索名称为libglo_crc.so 的库,但根据您的问题,函数Calculate_Message_CRC 在libglo_bc.so 中。是错字吗?还是我错过了什么?

UPD1: 正如 Steve C 所说:你确定这个库是用同一个编译器编译的吗?重整很大程度上取决于编译器。一个编译器可以将Calculate_Message_CRC 处理为Calculate_Message_CRC_FUcPUc,而其他编译器可以像Calculate_Message_CRC_XUzFUz 一样处理它。您可以使用 nm 和 grep 在您的代码中查找 Calculate_Message_CRC 以查看损坏的名称。和libglo_crc.so一样吗?

【讨论】:

    猜你喜欢
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    • 1970-01-01
    相关资源
    最近更新 更多