iOS - 在升级到Xcode 4.5后出现链接器错误,可能与Core Plot有关

17

我刚刚升级到Xcode 4.5GM并且优化了我的iPhone项目的一些屏幕以适应iPhone 5的额外屏幕尺寸。该项目针对iOS 5.1,我刚刚准备将其构建到我的手机上时出现了以下链接器错误:

文件是通用的(2个片段),但不包含(一个)armv7s片段: /Users/JonathanW/Documents/MyXcode/myApp/myApp/CorePlot/libCorePlot-CocoaTouch.a 针对架构armv7s

我的项目中使用了Core Plot 1.0静态库,在此之前我没有任何问题。周围有类似的构建架构设置错误,但不确定从哪里开始解决。该项目在模拟器中工作正常(iOS 5.1iOS 6都可以)。有什么想法吗?


你执行了“clean and rebuild”吗?还要检查一下你的架构中是否有armv6和armv7。你可能需要重新编译你的目标,并将库重新添加到目标中。 - apollosoftware.org
抱歉,我应该说是的,我已经做了所有通常的完全清理,删除派生数据,重建等操作。我甚至还进行了完全重新安装Xcode。 - Jonathan Wareham
10个回答

15

看起来你需要使用Xcode 4.5GM重新构建libCorePlot库,以便有一个ARMV7S版本的库。似乎它正在尝试使用旧版本Xcode构建的库。


2
@Ben 你如何重新构建libCorePlot库? - Jamie
3
非常感谢Ben,你的回答很到位。重新编译使用Xcode 4.5的Core Plot库是更大的挑战,但最终成功了!@Jamie - 我在这里找到了一些Core Plot的代码修复方案:http://code.google.com/p/core-plot/issues/detail?id=442 我希望他们会在iOS6发布后发布另一个主要版本。 - Jonathan Wareham
2
这就是为什么我们建议人们从代码库的最新代码http://code.google.com/p/core-plot/source/checkout开始工作,而不是使用二进制快照。按照此处的依赖项目说明:http://code.google.com/p/core-plot/wiki/UsingCorePlotInApplications,应该可以很好地构建新架构。 - Brad Larson
2
需要补充的一点是,您需要进入Core Plot项目,找到“仅构建活动架构”构建设置,并将其对于Debug和Release构建都更改为No。结合从最新的存储库源代码编译,这可以清除您可能遇到的任何armv7s链接器错误。 - Brad Larson
@BradLarson请检查一下我针对Xcode 5链接器错误问题的修复,除非我从Debug-iphoneos文件夹中删除旧库,否则不会消除错误...虽然这可以解决错误,但我仍然不得不删除“arm64”架构才能在iPad上运行。有关如何在等待新的CorePlot版本的过程中保留构建部分的任何想法吗? - whyoz
显示剩余3条评论

7
我在我的项目中也使用了Core Plot 1.0静态库。我通过将“Build Active Architectures Only”设置为“Yes”来解决了问题。在Xcode中,“Build Active Architectures Only”位于目标的“Build Settings”的“Architecture”部分。
我下载了Core Plot 1.0压缩文件,但似乎不完整,因此我无法重新构建库。

4
在模拟器中它能够正常工作是因为模拟器总是使用i386架构。这一点在新的SDK中没有改变。改变的是iPhone 5的出现,它使用了一个新的架构(armv7s)。你的应用程序项目自动将armv7s添加为有效的架构,但库可能是在不知道它的情况下编译的。因此,启用arm7s的应用程序尝试链接到一个没有armv7s构建的库,导致失败。
要解决这个问题,您只需要访问生成库的项目。修改目标上的“有效架构”设置,以包括armv7s,然后重新构建即可。

非常感谢Matt,你的回答非常准确。我已经接受了Ben的回答,因为他先回答了。 - Jonathan Wareham

2
我已经苦苦挣扎了好几天,最终通过创建一个新的静态库来使它工作起来了。
我使用了Mercurial源代码控制系统,按照这里的说明:使用Mercurial创建静态库和从这里找到的维基百科上的 "Core-Plot Static Library Install":如何在应用程序中进行静态库安装 我为像我这样经验较少的人发布这篇文章,因为这很简单并且自我解释。

0

修复使用Xcode 5时Core Plot的链接器错误

我已经使用Core Plot多年了,但是在更新“CorePlotHeader”文件夹(将删除的文件夹从我的项目中删除并将新文件夹拖入我的项目)以反映CorePlot_1.4更改时,出现了大量关于armv7s不支持某些文件的“Apple Mach-O Linker Warning”错误。我还删除了旧的“libCorePlot-CocoaTouch.a”库,并将其放入我的框架文件夹中。在模拟器中一切正常,但我无法在我的iOS 7.0.2上的iPad 4上构建。

这是我发现的唯一可以在调试时工作的方法(似乎在归档等方面也有效):

1)执行我上面提到的所有操作,将“Build Active Architectures”设置为No,然后清理

2)您可能会收到有关不支持体系结构“arm64”的错误,因此请从Build Settings中的“Valid Architecture”部分中删除“arm64”

3)在调试时,在您的产品文件夹中右键单击“MyApp.app”文件,您可能会看到旧的“libCorePlot-CocoaTouch.a”(如果修改日期早于9/28/13)正在与您的应用程序编译。

4) 删除该库并将新库复制到构建文件夹中,然后进行清理和重新构建

这适用于“静态库安装”方法,并未使用“依赖项目安装”方法进行测试


0

我在Xcode 4.4中使用Core Plot 1.0静态库来开发iOS 6.1应用。但是当我升级到带有iOS 7.0的Xcode 4.5后,遇到了与你相同的问题。

为了解决这个问题,我删除了我的项目中的CorePlotHeaders文件夹和libCorePlot-CocoaTouch.a文件。如果你在Xcode中删除它,请选择“移动到废纸篓”选项。

然后我从https://code.google.com/p/core-plot/downloads/list下载了CorePlot_1.4.zip,接着按照https://code.google.com/p/core-plot/wiki/UsingCorePlotInApplications中的“静态库安装”步骤进行操作。

希望能对你有所帮助。


0

你做了清理和重建吗?还要检查一下你的架构中是否有armv6和armv7。你可能需要重新编译你的目标并将库重新添加到目标中。


0

简单地说,我编译了core-plot库,并按照这个链接http://code.google.com/p/core-plot/wiki/UsingCorePlotInApplications上的依赖项目安装说明进行操作。
一切都进行得很顺利(我的项目现在支持armv7和armv7s,没有任何问题),此外,我还将Build Active Architecture Only设置为NO,以确保支持所有架构。


0

将CorePlot项目的编译器从Apple LLVM Compiler 4.1切换到LLVM GCC 4.2


不,这不是推荐的做法。请获取最新的代码库并基于此构建。 - Brad Larson

0

你只需要从有效架构列表中删除armv7s。

只需按照以下步骤操作: - 从项目导航器中选择您的项目 - 从目标列表中选择您的目标 - 选择“构建设置”选项卡 - 找到“有效架构”设置。它应该显示为armv7 armv7s。 删除armv7s,您的有效架构中将只有armv7。 现在您的项目将正确编译。


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