使用静态库复制符号 - 了解重复的符号错误消息

时间:2015-06-09 15:31:28

标签: ios linker

我在iOS项目中集成了一个外部库。当我尝试编译时,我得到了11个重复的符号。

这是输出的摘录:

duplicate symbol _serviceCallReturn in:
/Path/to/my/project/Classes/PointEngine/Device/libPointEngineSDK.a(PointEngineSDKUser.o)
/Path/to/my/project/Classes/PointEngine/Device/libPointEngineSDK.a(PointEngineSDKScanner.o)

duplicate symbol _serviceCallType in:
/Path/to/my/project/Classes/PointEngine/Device/libPointEngineSDK.a(PointEngineSDKScanner.o)
/Path/to/my/project/Classes/PointEngine/Device/libPointEngineSDK.a(PointEngineSDKProof.o)

这是什么意思?例如PointEngineSDKUser.olibPointEngineSDK.a之间的关系是什么?知道什么样的错误配置会导致这种情况吗?

当我创建一个空的iOS项目并将库集成到其中时,它就像一个魅力。问题必须出在我现有的项目配置中。

1 个答案:

答案 0 :(得分:0)

简而言之:

  • *.o个文件是可重定位的ELF。它们是编译器的产品,它总是使用源文件作为其工作的输入。
  • *.a个文件是ar档案。它们是所谓的ar program的产物,它总是使用可重定位的ELF对象作为其工作的输入。

现在,要解决第一个问题(重复符号_serviceCallReturn ):

  1. 转到并打开PointEngineSDKUser.c和PointEngineSDKScanner.c文件,从中创建相应的* .o对象。
  2. 你应该在它们中找到serviceCallReturn变量定义,这是不正确的,这就是你看到链接器抱怨的原因。
  3. 如果最初的意图是在两个.c文件中使用相同的变量,则应使用extern关键字定义其中一个变量。否则,请为其中一个变量使用其他名称。