未定义的引用,但符号不匹配。函数被编译并存在于静态库中

Undefined references, but symbols don't match. Function is compiled and exist in static library

提问人:kroger9 提问时间:10/14/2022 最后编辑:kroger9 更新时间:10/14/2022 访问量:99

问:

谁能为我指明正确的方向?这是专有代码,所以我无法上传制作文件。

但这是 nm 的输出:libA

libA.a:someOfile.o:                 U _Z12funcABCPcPA80_cii
libA.a:overhead.o:                 U _Z12funcABCPcPA80_cii

这里是 nm 的 ,其中来自另外两个函数的感兴趣函数的渲染:libBundefined references

libB.a:funcABC.o:0000000000000000 T _Z12funcABCPcPA64_ci

有一个类似的项目完成匹配.我正在移植代码库以支持新平台。_Z12FUNCABCPcPA64_ci

类似项目的这个 nm 输出:

libB.a:funcABC.o:0000000000000000 T _Z12funcABCPcPA64_c


libA.a:overhead.o:                 U _Z12funcABCPcPA64_c

澄清: 我只是为了在 SO 上发布而替换了函数名称:)

原始函数签名,在两个项目上:

#define LENGTH 64

bool funcABC( char* arg1, char arg2 [][LENGTH], int arg3)

溶液:

有问题的库未正确移植。这是一个旧版本,我没有移植。因此,由于下面的评论,它不断出现链接错误。 应该有以下声明,我应该仔细阅读函数定义。libBlibB

bool funcABC(char*arg1, char arg2 [] [LENGTH_INHEADER], int arg3, int arg4)

在 中,的宽度基于 。在 中,宽度应为 。funcABC.cpparg2LENGTH 64funcABC.hLENGTH_INHEADER 80

C++ Linux CentOS7 LD 纳米

评论

2赞 user253751 10/14/2022
这是不一样的。一个是 64,一个是 80

答:

2赞 n. m. could be an AI 10/14/2022 #1

我假设您用 .这打破了混乱的 ABI。如果原始名称的长度为 12 个字符,则应将 12 替换为新长度。funcABC

  • _Z7funcABCPcPA80_cii解缠到funcABC(char*, char (*) [80], int, int)
  • _Z7funcABCPcPA64_ci解缠到funcABC(char*, char (*) [64], int)
  • _Z7funcABCPcPA64_c解缠到funcABC(char*, char (*) [64])

这些是完全不同的功能。

评论

0赞 kroger9 10/14/2022
顺便说一句,你是怎么对符号进行修饰的?我想将其添加到我的调试知识库中。
2赞 n. m. could be an AI 10/14/2022
@kroger9 有 c++filt、llvm-cxxfilt 和 demumble 等工具。