【问题标题】:Method is both defined and undefined in a static Linux library方法在静态 Linux 库中定义和未定义
【发布时间】:2021-08-19 14:09:03
【问题描述】:

我正在使用 Visual Studio 2019 并为 ARM android 进行编译。 我的解决方案中的十二个库之一无法正确链接。

它显示了大量已定义和未定义的类方法。

这是一个使用命令行的示例:
nm -C -g Services_Droid.a 1>Services_Droid_All.txt

我得到一个列表,示例构造方法显示::

E:\code\Services_Droid_All.txt(5 次点击)

Line 834:           U hCitem::hCitem(int)
Line 1073:          U hCitem::hCitem(int)
Line 1197: 0000006c T hCitem::hCitem(int)   // there is only one definition in this file
Line 1199: 0000006c T hCitem::hCitem(int)
Line 5747:          U hCitem::hCitem(int)

将此库链接到我的主程序会生成三个的副本 链接失败的未定义项。

这个库中有大量的方法存在相同的问题。

任何关于导致此问题的原因以及如何解决此问题的想法将不胜感激。

【问题讨论】:

  • 您确定所有这些未定义的符号与已定义的符号来自同一个目标文件吗?一个函数在一个目标文件中定义而在另一个目标文件中未定义是很正常的。库只是目标文件的集合。此外,构造函数有两个版本的符号是正常的(重命名的名称不同)。
  • 我的分享在哪里:谢谢。我不知道图书馆员没有链接静态库。为什么未定义保留在主动态库链接中的任何想法? (即动态库链接在几个静态库中,这是其中之一。)

标签: linux gcc linker visual-studio-2019


【解决方案1】:

它显示了大量已定义和未定义的类方法。

完全正常:存档库只不过是.o 文件的集合。这些文件之一定义了hCitem::hCitem(int)。其他一些文件引用了它。

您可以通过使用nm -AC Services_Droid.a 观察到实际上是这种情况。

我的解决方案中的十二个库之一无法正确链接。

你应该问一个单独的问题,解释你的实际问题。

【讨论】:

  • 好吧,让我们放弃这个。当我可以隔离它时,我会提出一个链接器问题。
  • @PaulWinkle 你不应该放弃你提出的问题。如果这个答案对您有帮助,请点赞。如果它完全回答了您提出的问题,也接受答案。
  • n. 1.8e9-where's-my-share m。实际上是第一个;)
  • @PaulWinkle 你找到导致链接错误的原因了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多