ios - Mach-O 链接器错误,将 xcode 升级到 8.0 后未定义的体系结构符号

标签 ios objective-c iphone xcode

我已经升级到 XCode 8.0,这让我很伤心。第一个问题与代码签名有关。我通过从常规项目设置中选择用于调试和发布的配置文件来解决这个问题。奇怪的是不知道为什么它不能正常工作,因为它与以前的 XCode 完美编译。以前 XCode 会说没有临时配置文件并提示修复它并且会修复它。似乎退后一步。无论如何,通过了那个问题。

我一整天都面临的问题是编译时出现这个错误

Undefined symbols for architecture arm64:
  "_write_ret", referenced from:
      _dwsl in libtestlib.a(testlib.o)
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我搜索了write_ret,它只是一个头文件中的原型(prototype),根本没有在任何地方调用这个函数!! (背景静态库是一个更大项目的一部分,我只带来了为 iOS 编译静态库所需的文件/代码)。多年来,这是完美的编译。我回到静态库源代码,为了让自己开心,我删除了 write_ret 原型(prototype)并编译它,更新了我项目中的库并重新构建。再次出现同样的错误!这里发生了什么??我确认它确实使用了正确的内置库。

然后我决定只为 armv7 构建,因为这是一个企业应用程序。我回到静态库项目文件,从“valid architectures”中删除了 armv7sarm64。我将“体系结构”更改为 armv7。我重建了库并用新库更新了项目。

我还进入了主项目并将有效架构更改为仅针对 armv7 构建。

这次当我构建我的项目时我得到了这个错误

ld: warning: ignoring file /Users/rrr/Library/Developer/Xcode/DerivedData/P-eaxegvaceikvgqgllfiardmoorbv/Build/Products/Debug-iphoneos/libtestlib.a, 
file was built for archive which is not the architecture being linked (armv7):
 /Users/rrr/Library/Developer/Xcode/DerivedData/P-eaxegvaceikvgqgllfiardmoorbv/Build/Products/Debug-iphoneos/libtestlib.a

在终端中我运行了 lipo libteSTLib.a -info 我得到了这个:

input file libtestlib.a is not a fat file
Non-fat file: libtestlib.a is architecture: armv7

所以它是为 armv7 构建的,那么 XCode 到底在提示什么?

我现在没主意了。任何人都可以在这里阐明一些问题吗?

我想让它在我周五进行的 XCode 升级之前与所有架构一起工作。但最坏的情况至少编译为仅适用于 armv7。我的理解是它仍然可以在任何 iPhone 5s 和更新版本的设备上运行。

最佳答案

首先,如您所知,按照 Apple 的规则,您应该支持 arm64 才能支持 64 位架构。

其次,让我们谈谈 undefined symbol 问题,您的第一个问题。
我不确定你的情况描述,但是,
我在阅读这个问题时想到的一件事是你的静态库可能依赖于一些从 Xcode 7 中弃用的 dylib(动态库或共享库)。

可能的情况是你的 dylib 库在 Xcode 8 更新版本的项目中被标记为红色,因为它被替换为 tbd 而不是 dylib。

所以,这个库现在缺少状态,你确实在图书馆列表中删除了它,但你忘记了它。
这就是为什么您的 libteSTLib.a 中的 _write_ret 符号不能再链接到架构 arm64。(dylib 缺少状态。)

如果这种情况属实,请导入待定而不是 dylib。(基于文本的 stub 库)。


我们来谈谈你的第二个与错误日志相关的问题。

ld: warning: ignoring file /Users/rrr/Library/Developer/Xcode/DerivedData/P-       eaxegvaceikvgqgllfiardmoorbv/Build/Products/Debug-iphoneos/libtestlib.a, 
file was built for archive which is not the architecture being linked (armv7):
 /Users/rrr/Library/Developer/Xcode/DerivedData/P-    eaxegvaceikvgqgllfiardmoorbv/Build/Products/Debug-iphoneos/libtestlib.a 

此日志可能是关于 Xcode build设置中的 Build Active Architecture Only。
将“仅构建事件架构”从是到否选中。
当在您的build设置情况下将 Build Active Architecture Only 设置为 YES 时,可能会生成错误日志。 而且,如果它不起作用,您是否清理过 DerivedData 目录和项目?

如果您已经尝试过,您的静态库可能实际上不在/Users/rrr/Library/Developer/Xcode/DerivedData/P-eaxegvaceikvgqgllfiardmoorbv/Build/Products/Debug-iphoneos/libteSTLib.a 中。

所以,您可以将您的静态库输出移动到这个项目中,然后再试一次。

当我收到您的问题时,这些只是针对您的情况的情景。 我希望它能提供一点帮助。

谢谢。

关于ios - Mach-O 链接器错误,将 xcode 升级到 8.0 后未定义的体系结构符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39716678/

相关文章:

objective-c - 在 ARC 下,当通过属性分配给 ivar 时, block 是否会自动复制?

iphone - 如何在不需要时停止创建对象实例

iphone - RightBarButtonItem 大写文本?

iphone - 在 iOS 媒体播放器 Controller 中禁用全屏模式

ios - iphone x 中应用程序顶部和底部的黑屏

iphone - 添加微调器时 UIView 动画失败?

ios - 如何检查两个文本字段是否相同?

ios - 我应该在 MonoTouch 应用程序中的何处执行维护

ios - 快速加载 Firebase 数据时重新加载 View Controller

objective-c - Swift 只读外部,可读写内部属性