文件libCorePlot-CocoaTouch.a缺少所需的x86_64架构。

19

根据Ray Wenderlich教程的指导,我完成了以下步骤:

Step 1 - 我从官方网站下载了CorePlot_1.4.zip

Step 2 - 我将CorePlotHeaders文件夹名为libCorePlot-CocoaTouch.a的静态库添加到我的项目中(勾选“如果需要,将项目复制到目标组的文件夹中”)

Step 3 - 我将以下内容添加到Other Linker Flags字段中:-ObjC

Step 4 - 我检查了Link Binary with Libraries中是否有libCorePlot-CocoaTouch.aQuartzCore框架

结果: 当我使用Iphone Retina(4英寸)时,编译我的项目时它可以正常工作。但是当我使用Iphone Retina(4英寸64位)时,尝试构建和运行时我会得到以下消息:

ld: 警告:忽略文件 /blah/blah/libCorePlot-CocoaTouch.a,文件 /blah/blah/libCorePlot-CocoaTouch.a 中缺少所需的架构 x86_64(3个切片)

这里是完整的消息:

ld: warning: ignoring file /Users/me/Desktop/project/libCorePlot-CocoaTouch.a, missing required architecture x86_64 in file /Users/me/Desktop/project/libCorePlot-CocoaTouch.a (3 slices)
Undefined symbols for architecture x86_64:
"_CPTDecimalFromCGFloat", referenced from:
  -[PatientConstanteVisualiser configurePlots] in PatientConstanteVisualiser.o
  -[PatientConstanteVisualiser configureAxes] in PatientConstanteVisualiser.o
"_CPTDecimalFromInteger", referenced from:
  -[PatientConstanteVisualiser configureAxes] in PatientConstanteVisualiser.o
"_OBJC_CLASS_$_CPTAxisLabel", referenced from:
  objc-class-ref in PatientConstanteVisualiser.o
"_OBJC_CLASS_$_CPTColor", referenced from:
  objc-class-ref in PatientConstanteVisualiser.o
"_OBJC_CLASS_$_CPTFill", referenced from:
  objc-class-ref in PatientConstanteVisualiser.o
"_OBJC_CLASS_$_CPTMutableLineStyle", referenced from:
  objc-class-ref in PatientConstanteVisualiser.o
"_OBJC_CLASS_$_CPTMutableTextStyle", referenced from:
  objc-class-ref in PatientConstanteVisualiser.o
"_OBJC_CLASS_$_CPTPlotSymbol", referenced from:
  objc-class-ref in PatientConstanteVisualiser.o
"_OBJC_CLASS_$_CPTScatterPlot", referenced from:
  objc-class-ref in PatientConstanteVisualiser.o
"_OBJC_CLASS_$_CPTTheme", referenced from:
  objc-class-ref in PatientConstanteVisualiser.o
"_OBJC_CLASS_$_CPTXYGraph", referenced from:
  objc-class-ref in PatientConstanteVisualiser.o
"_kCPTStocksTheme", referenced from:
  -[PatientConstanteVisualiser configureGraph] in PatientConstanteVisualiser.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我在这个问题上花了几个小时...请帮帮我...


更改Xcode的架构。 - codercat
我发现CorePlot不支持64位架构,已经进行了检查。 - codercat
不,我已经在另一个项目中使用了Core Plot,并且我能够在iPhone Retina(4英寸64位)上运行它。但我找不到为什么它在我的新项目中无法工作的原因... - Jonathan F.
check my answer now @ - codercat
9个回答

20

如果你需要64位版本的Core Plot,你需要构建新版本的静态库。Arm64构建需要iOS 7,但Core Plot支持更早的版本,因此预编译的库仅为32位。

打开CorePlot-CocoaTouch.xcodeproj并将架构设置更改为“标准架构(包括64位)”。可以构建“通用库”目标,并将生成的静态库替换Core Plot 1.4中包含的静态库,也可以使用依赖项目进行设置。


没错,它可以工作!很奇怪,因为在另一个项目中我不需要做所有这些事情,但是在32位或64位模拟器上都能像魔法一样工作... - Jonathan F.
我接受这个答案,因为它可行。但是Ivan Genchev的答案也可以使用。所以非常感谢Ivan和Eric。 - Jonathan F.
嗨Eric,我有一个关于CorePlot-CocoaTouch.xcodeproj的问题。它无法打开,并显示“project.xcworkspace”无效和“project.pbxproj”丢失。出了什么问题? - Burrito411
CorePlot-CocoaTouch.xcodeproj不依赖于任何其他项目或工作区。您使用的是哪个版本?它是如何安装的(从GitHub,从发布包等)? - Eric Skroch
我刚刚更新到XCode 5.1,现在才看到这个问题。从Core Plot构建通用库似乎没有解决任何问题,我仍然遇到与Erzekiel相同的错误。在5.1中是否有任何新的东西导致这个问题重新出现? - RL2000
显示剩余2条评论

14

CorePlot发布了1.5.1版本,可与Xcode 5.1配套使用。您只需要将CorePlotHeaders文件夹和libCorePlot-CocoaTouch.a文件复制到项目中即可。

您可以在这里下载。


非常感谢,再也没有arm64问题了,只需要在CorePlotHeaders文件夹中添加一个小注释,并将libCorePlot-CocoaTouch.a放入CorePLor_1.5.1.zip的Binaries \ iOS文件夹中即可。完美运行。 - Boris Gafurov
请问您能告诉我在哪里可以找到CorePlotHeaders文件夹吗? - Divya

13

尝试:

lipo -info libCorePlot-CocoaTouch.a

显示该库是为armv7、armv7s和i386(32位模拟器)构建的,不包括64位模拟器。 您需要为64位模拟器构建库,然后使用lipo将64位库添加到libCorePlot-CocoaTouch.a中。

Architectures in the fat file: libCorePlot-CocoaTouch.a are: armv7 armv7s i386

PS: 这也不适用于iPhone 5S(没有arm64)。

编辑:

以下是您需要进行的步骤,以生成同时具有arm64和x86_64体系结构的二进制文件:

  1. https://code.google.com/p/core-plot/downloads/detail?name=CorePlot_1.4.zip&can=2&q=下载CorePlot_1.4。
  2. 打开位于CorePlot_1.4/Source/framework中的Xcode项目(CorePlot-CocoaTouch.xcodeproj)
  3. 选择“标准架构”作为“架构”,选择“最新iOS (iOS 7)”作为“基本SDK”
  4. 构建库(CMD+B)
  5. 进入终端中的CorePlot_1.4/Source/build/目录
  6. 运行 lipo -create ./Debug-iphoneos/libCorePlot-CocoaTouch.a ./Debug-iphonesimulator/libCorePlot-CocoaTouch.a -output core_plot_all.a
  7. 将新创建的lib(core_plot_all.a)添加到您的项目中
  8. 就可以开始了

这是一个命令行工具。如果你想了解更多关于lipo的信息,可以在命令行上尝试man 1 lipo。如果你不熟悉bash,也可以打开CorePlot-CocoaTouch.xcodeproj并自己构建库(在添加所需架构后)。 - Ivan Genchev
我在终端中使用了lipo。这是我的结果:**/Users/me/Desktop/project/libCorePlot-CocoaTouch.a中的fat文件架构为:armv7(cputype(12)cpusubtype(11))i386**。 - Jonathan F.
糟糕!抱歉。好的,我尝试你说的那个。 - Jonathan F.
好的,我可以在iPhone Retina(4英寸64位)上构建和运行!但现在,我有很多警告,显示为:“隐式转换会导致整数精度丢失:'NSInteger'(又名'long')到'int'”... 唉。 - Jonathan F.
通用库目标仍在构建两个单独的库(用于模拟和设备),而Binaries/iOS/中的库仍然是旧的...也许出了些问题。 - Ivan Genchev
显示剩余13条评论

6
改变Xcode的架构设置。 输入图像描述

@Erzékiel,请尝试使用新的答案。 - codercat

5
如果您不想经历下载和构建项目的过程,我已经构建了通用库(适用于armv7、armv7s和arm64),并将其放在这里
此库是从coreplot提交ID为cc0a18cef8915f4a11e0699e9429c0a2f0018b42构建的。

0
我在Xcode 7.2.1和iOS SDK 9.2中遵循官方文档'在应用程序中使用Core Plot'。即使.a支持arm64,我仍然遇到了相同的错误,直到我除了'-OjbC'之外还添加了链接器标志'-lCorePlot-CocoaTouch'。

0
如果你尝试了上述所有方法但仍然不起作用,请尝试在“构建设置”或者你的项目目标中将-ObjC -lCorePlot-CocoaTouch设置为“其他链接器标志”。

0

对我而言最简单的解决方案是:进入你的项目 > 构建设置 > 架构。将架构更改为armv7并删除其他架构,如图像中所示的armv6等:

Change required


如果您想在64位模拟器下进行测试怎么办? - trojanfoe

0

我在使用Xcode7.3 + CocoaPod时遇到了同样的错误。我通过设置Other Linker Flags= $(inherited)来解决了这个问题。

当然,这个设置只适用于CocoaPod。


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