Xcode 6.1 上架构 x86_64 的未定义符号
Posted
技术标签:
【中文标题】Xcode 6.1 上架构 x86_64 的未定义符号【英文标题】:Undefined symbols for architecture x86_64 on Xcode 6.1 【发布时间】:2014-10-25 06:32:07 【问题描述】:Xcode 在编译时突然向我抛出了这个错误:
Undefined symbols for architecture x86_64:
"_OBJC_CLASS_$_Format", referenced from:
objc-class-ref in WOExerciseListViewController.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
经过一番研究,我可能了解到我正在使用的库与 64 位版本不兼容。但这很奇怪,因为我已经使用相同的库至少一周了,在那段时间没有遇到任何编译问题。这两个库只是由一堆类组成,当我从项目中删除它们时,我遇到了同样的问题。由于我自己从未创建过库,所以我不知道如何找到我正在使用的库是否与 64 位兼容(?) 我还尝试了目标面板下架构的以下更改:
将 $(ARCHS_STANDARD_INCLUDING_64_BIT) 添加到架构中 仅构建活动架构 -> 设置为“否” 对于“有效架构”-> 设置为 arm64、armv7 和 armv7s 删除了 DerivedData 文件夹及其内容,清理并再次构建但是这些更改都不起作用。请问,有人有这方面的线索吗? 谢谢
【问题讨论】:
您在 xcode 中更改或移动了文件“WOExerciseListViewController” 最终如果你想知道库的架构和内容,那么你需要使用file
、lipo
、nm
和ar
来调查。
我从我的代码中删除了对这些 3rd 方类的所有引用,但我仍然遇到同样的问题:“架构 i386 的未定义符号”和架构 x86_64 的相同问题。 @Droppy 我是新手,当我说“库”时,我的意思是一个文件夹,其中包含我从 CocoaPods 导入的一些类(.m 和 .h)文件。是否有与这些类相关的 .a 文件,或者我完全误解了库的含义?我还尝试在不使用 cocoaPods 的情况下简单地拖动类,同样的问题。
【参考方案1】:
显然,您的“格式”类与问题有关。检查你对这个类的声明,特别是如果你在另一个类中做了它,你可能忘记了@implementation 或类似的东西。
【讨论】:
确实,我忘记在 WOExerciseListViewController.m 中我的 @ 接口格式下方声明一个 @ 实现我是如此专注于这个库兼容性主题,我从来没有想过这个!谢谢 我在此处遵循 Apple 的 Cocoa 教程:developer.apple.com/library/mac/referencelibrary/GettingStarted/…,您在其中开发了一个名为 TrackMix 的应用程序,在为 Track 类添加文件后,我遇到了与操作相同的错误。教程说,文件现在应该位于项目的 TrackMix 组文件夹中。如果您查看文件,您会看到为您提供了存根类接口和实现声明。 但对我来说不是这样...... 我不得不手动创建这两个文件,而 Track.m 没有 stub 实现。阅读您的答案后,我在 Track.m 中添加了@implementation Track
和下一行@end
,错误消失了。谢谢!
看起来这个问题一开始可以通过选择:File>New>File,然后选择 OS X,然后选择 Cocoa Class
(而不是 Objective-C 文件)来避免。这将创建 Track.m 和 Track.h 并在这些文件中提供存根。
我面临同样的问题,我已经检查了@implementation 的东西,但我可以看到一切都很好,无法弄清楚我该如何解决它?任何帮助将不胜感激。【参考方案2】:
检查该文件是否包含在 Build Phases -> Compiled Sources
【讨论】:
当我在今天的扩展中遇到这个错误时,这就是我所做的,它试图使用主包中的代码文件。 是的,您可能在合并过程中“丢失”了文件。就我而言,事实证明,在整个项目文件中,ID 为 2BA85A8D...48CD 的文件在构建时被引用为 2BA85A8E...48CD。因此,该文件在 Xcode 中可见且可导航,但在编译/链接时不可用。【参考方案3】:确保 WOExerciseListViewController 是目标成员;这对我有用!
【讨论】:
奇怪的是,这似乎对我有用。但首先我必须取消选中然后重新选中 Target Membership 复选框。 没有检查文件的目标。它有帮助。谢谢!【参考方案4】:是的,我认为您使用的库与 64 位版本不兼容,但您可以解决问题 -
只需导航到 Build Settings>Architectures 并将 $(ARCHS_STANDARD)
替换为 $(ARCHS_STANDARD_32_BIT)
以便您的 xcode 使用 32 位支持的版本构建您的项目。
【讨论】:
我得到:ios 12 不支持 32 位程序【参考方案5】:当我在 Xcode 6.4 中打开一个(相当)旧项目时,我遇到了这个错误,该项目是在 Xcode 4~ish 中创建的。虽然链接的框架在项目侧边栏中可见,但我忽略了Target Build Phases 选项卡中没有链接库。一旦我解决了这个问题,它就可以正常编译了。
【讨论】:
这是为我做的,试图包含来自Square's TimesSquare calendar component 的'libTimeSquare.a'。作为记录,我试图从 Cocoapod 条目中集成它。【参考方案6】:原来我忘了写我的@implementation
部分。
【讨论】:
【参考方案7】:我只是没有在“将二进制文件与库链接”部分中链接库。
【讨论】:
【参考方案8】:我通过转到 Xcode 构建设置和架构解决了同样的问题,我改变了 Xcode 6.1.1 标准架构:-
$(ARCHS_STANDARD_32_BIT)
【讨论】:
这不是一个有效的修复,因为苹果已经强制开发者使用 $ARCHS_STANDARD 架构来支持 64 位。此外,$(ARCHS_STANDARD_32_BIT) 不再可用。 同意!但是当你在测试时你不明白这个 bug 实际上是 32 位/64 位架构的。使用我上面的答案可以节省大量调试时间。【参考方案9】:我刚刚遇到了完全相同的错误,并通过重新启动 xcode 解决了它。
对我来说,问题发生在 svn 更新之后,相关文件已添加到项目文件夹中,但它从未出现在 xcode(9.3.1) 中——直到我重新启动它。
【讨论】:
【参考方案10】:当我复制/粘贴一个类并忘记在 .m 文件中重命名它时出现同样的错误。
【讨论】:
【参考方案11】:我通过删除对文件的引用并在项目中再次添加它来解决问题。就我而言,它有效。
【讨论】:
【参考方案12】:这个设置对我有用:
架构=$(ARCHS_STANDARD_32_BIT) 仅构建活动架构:是 有效架构 armv6 armv7 armv7s arm64【讨论】:
【参考方案13】:删除$(ARCHS_STANDARD)
并添加$(ARCHS_STANDARD_32_BIT)
。
【讨论】:
以上是关于Xcode 6.1 上架构 x86_64 的未定义符号的主要内容,如果未能解决你的问题,请参考以下文章
Xcode 无法构建 React Native 项目,架构 x86_64 的未定义符号
终端中的“架构 x86_64 的未定义符号”,但 xcode 中没有错误
架构 x86_64 的未定义符号:JNI_CreateJavaVM OS-X Xcode