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

时间:2016-09-27 05:33:04

标签: 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并且它只是头文件中的原型,这个函数根本不会被调用! (背景静态库是一个更大的项目的一部分,我只带来了编译iOS静态库所需的文件/代码)。这是多年前完美编译的。我回到静态库的源代码并幽默自己删除了write_ret原型并编译它并更新了我的项目中的库并重建。再次出现同样的错误!这里发生了什么??我确认它肯定是使用正确的构建库。

然后我决定只为armv7构建,因为这是一个企业应用。我回到了静态库项目文件,从" armv7s"中删除了arm64valid architectures。我改变了#34;架构"到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和更新版本上运行。

1 个答案:

答案 0 :(得分:1)

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

第二,让我们谈谈未定义的符号问题,第一个问题 我不确定你的情况描述,但是,在我的脑海中读到一个问题是你的静态库可能依赖于从Xcode 7弃用的一些dylib(动态或共享库)。

可能的情况是您的dylib库在Xcode 8更新版本的项目中被红色标记,因为它被替换为tbd而不是dylib。
所以,这个库现在缺少状态,你确实删除了它在库列表中,你忘了它。
这就是为什么libtestlib.a中的_write_ret符号无法再与架构arm64链接的原因。(dylib缺少状态。)

如果这种情况为真,则导入tbd而不是dylib。(基于文本的存根库)。

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

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 

此日志可以是关于X​​code构建设置中的Build Active Architecture 检查'仅构建活动架构'从是到否 在构建设置情况下将Build Active Architecture Only设置为YES时,可能会生成错误日志。 并且,如果它不起作用,您是否曾经清理过DerivedData目录和项目?

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

因此,您可以将静态库输出移动到此项目中并再次尝试。

当我得到你的问题时,这些只是适合你情况的场景。 我希望它能得到一点帮助。

感谢。