Xcode 6.3中x86_64架构的未定义符号

23
我正在完成一个开源的C语言CometD库,我认为将其开放给像我一样的OSX/iOS用户是一个好主意。
为了方便OSX/iOS开发人员的工作,我想从静态C库转换为Xcode iOS静态库。因此,我遵循了网上的建议,并生成了一个静态iOS兼容库。
问题在于,每次我尝试使用它时,我都会收到类型为“Undefined symbols for architecture x86_64”的错误消息:
Undefined symbols for architecture x86_64: ******, referenced from: -********** in *******.a(*******.o)
这个错误几乎针对我库中的每个C函数都会重复出现。
起初,我以为可能是库不兼容x86_64,或者为空,或者确实没有任何x86_64符号。
所以我用“lipo -info”检查了一下库,这是答案:

enter image description here

为了确保,我还在库上使用了“nm -arch x86_64”,并查找了Xcode报告的多个未定义函数。我原以为会错,什么也找不到,但是猜猜看呢?
我找到了这些符号:enter image description here

enter image description here

我的问题是:如果符号在x86_64兼容库中存在,为什么Xcode会提示此错误?即使我将库编译为所有arm*/s类型,我仍然会收到x86_64错误。我是不是对某些事情毫无所知或者做错了什么?
非常感谢您的回答。
更新(这是Xcode项目链接):https://github.com/GhostGumm/CometD-x86_64-issue 更新2:Trojanfoe先生引起了我的注意,因为我在编译时有一个链接警告。实际上,链接器似乎错过了加载库,寻找一个不存在的目录。将库移动到正确的目录后,手动链接它,x86_64错误消失了。
遗憾的是,问题仍然存在。在成功编译后,当我像这样“alloc”和“init”我的主类时,我尝试使用lib:
  ZetaFactory *Client = [[ZetaFactory alloc] init]; 

x86_64错误带着数十亿个太阳的真正猛烈回来了。

我已经发布了Xcode项目的链接,请随意测试,因为我没有更多的想法来修复它,但更重要的是为什么和在哪里出现了问题。

无论如何,我将继续调查。


1
问题提得很好,展示了充分的努力。为了澄清,您是在构建iOS模拟器,对吗? - trojanfoe
模拟器是可以的,但是设备也是可以的,第二次使用。 - Hakeem El Bakka-lee
@Maresh 是的,仍未解决。(我和他谈过了) - Xcrowzz
@IwillnotexistIdonotexist 我扫描了我在Xcode项目目录中找到的库。CarbonComet/PLib/src/http_transport.c是我电脑上一个目录的参考,我在导入时勾选了复制选项,并将文件添加到编译源中。该库是我在XCode中处理的已编译C源代码静态库,我针对它进行编译,这样做有问题吗?我将手动复制粘贴文件并查看发生了什么。 - Hakeem El Bakka-lee
为什么在“Build Phases”中的“Compile Source”和“Link Binaries with Library”中会缺少这么多内容?这可能是问题的原因。 - Duck
显示剩余12条评论
1个回答

4
我下载并尝试构建了您的项目。看到链接错误——例如未找到init_stack_remove_data——这些错误是正确的。在您的项目源代码中没有init_stack_remove_data的定义。
请注意,您引用的“nm -arch x86_64”输出中,在函数定义之前的“U”表示对该函数的使用,而不是其定义。 nm输出显示链接器是正确的-您的代码调用这些函数,但是从未定义过它们。当它们被定义时,您将在nm输出中看到函数之前的“T”。
您需要使用其他必要源代码更新您的项目,然后才能进行链接而不出现错误。

我已经离家几周了,一旦我到达Mac电脑或回家的电脑,我会尽快更新。我也会用更干净的存储库更新问题。 - Hakeem El Bakka-lee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接