GoogleMapsSDK:架构 x86_64 的未定义符号

Posted

技术标签:

【中文标题】GoogleMapsSDK:架构 x86_64 的未定义符号【英文标题】:GoogleMapsSDK : Undefined symbols for architecture x86_64 【发布时间】:2015-08-23 03:19:13 【问题描述】:

我正在尝试安装 Google 地图 SDK,运行时出现此错误:

Undefined symbols for architecture x86_64:
  "_CBAdvertisementDataManufacturerDataKey", referenced from:
      -[GMSx_PEBeaconScanner centralManager:didDiscoverPeripheral:advertisementData:RSSI:] in GoogleMaps(PEBeaconScanner.o)
  "_CBAdvertisementDataServiceDataKey", referenced from:
      -[GMSx_PEBeaconScanner centralManager:didDiscoverPeripheral:advertisementData:RSSI:] in GoogleMaps(PEBeaconScanner.o)
  "_CBCentralManagerScanOptionAllowDuplicatesKey", referenced from:
      -[GMSx_PEBeaconScanner scanIfAppropriate] in GoogleMaps(PEBeaconScanner.o)
  "_OBJC_CLASS_$_CBCentralManager", referenced from:
      objc-class-ref in GoogleMaps(PEBeaconScanner.o)
  "_OBJC_CLASS_$_CBUUID", referenced from:
      objc-class-ref in GoogleMaps(PEBeacon.o)
      objc-class-ref in GoogleMaps(PEBeaconScanner.o)
  "_vImageBoxConvolve_Planar8", referenced from:
      (anonymous namespace)::CreateBlurredImage(CGImage*, double, double) in GoogleMaps(GLWaterGroup.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

【问题讨论】:

【参考方案1】:

当我升级使用手动安装的旧版 Google 地图 SDK 的应用时,我注意到以下变化:

需要在 Build Phases -> Link Bundle with Libraries 中链接到 CoreBluetooth.frameworkAccelerate.framework。 “其他链接器标志”下的 -all_load 标志将导致“重复符号”错误。 (改用 -ObjC。)

如果您使用 CocoaPods 安装方法(根据他们当前的说明),它应该采用所需的框架,但它仍然会被 -all_load 搞砸。

【讨论】:

这节省了我很多时间.. +1 这个。 为什么谷歌不能记录这个!谢谢我的朋友!【参考方案2】:

确保包含以下内容

GoogleMaps SDK 框架和捆绑包

GoogleMaps(带有 .framework 扩展名)位于您的根目录(您的 .xcodeproj 所在的位置)

您的 xcode 项目中引用了 GoogleMaps(扩展名为 .bundle)

以下框架

Accelerate.framework

AVFoundation.framework

CoreBluetooth.framework

CoreData.framework

CoreGraphics.framework

CoreLocation.framework

CoreText.framework

GLKit.framework

ImageIO.framework

libc++.dylib

libicucore.dylib

libz.dylib

OpenGLES.framework

QuartzCore.framework

安全性框架

SystemConfiguration.framework

构建设置

您的项目设置中的架构值包括 armv7。

Other Linker Flags 有 -ObjC ,如果不存在添加它

【讨论】:

如果我不能使用 -ObjC 标志怎么办?我需要它用于谷歌地图,但它会导致与解析框架发生冲突。有什么帮助吗?使用 -force_load 会导致符号重复... 这个答案解决了我使用 google maps ios sdk 2.0.1(在撰写本文时)的github.com/mapsplugin/cordova-plugin-googlemapscordova 插件的问题。【参考方案3】:
**_vImageBoxConvolve_Planar8, referenced from: (anonymous namespace)::CreateBlurredImage(CGImage*, double, double) in GoogleMaps(GLWaterGroup.o)**

This required "Accelerate.framework". So, please add it.

Steps:
1)Build Phases -> Link Bundle with Libraries.
2)Click "+",
3)Select "Accelerate.framework". Finish.

===================================

Others errors required "CoreBluetooth.framework. So, please add it also in similar way.

【讨论】:

你让我很开心 Arun +1 如果您要从应用程序中删除 Google 地图,这也是解决方案,除非您执行“-”【参考方案4】:

看起来 Google 的 API 需要 CoreBluetooth 来定位信标。在构建阶段链接CoreBluetooth.framework,一切都应该没问题。

编辑: 确保按照这些说明安装 GoogleMaps 以避免出现任何问题:https://developers.google.com/maps/documentation/ios/start

【讨论】:

谢谢昆汀。我只是这样做了,不幸的是它发送了另一个错误:架构 x86_64 的未定义符号:“_vImageBoxConvolve_Planar8”,引用自:(匿名命名空间)::CreateBlurredImage(CGImage*, double, double) in GoogleMaps(GLWaterGroup.o) ld: symbol( s) 未找到架构 x86_64 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) 你应该按照这些说明来确保你需要的所有东西都安装好了:developers.google.com/maps/documentation/ios/start 是的,这些指令很糟糕,IMO 没有提到 CoreBluetooth。 所以看起来 _vImageBoxConvolve_Planar8 在 Accelerate.framework 中可用。我将它添加到我的项目中,问题就消失了,现在它抱怨 GoogleMaps.framework 定义了 706 个重复符号:( 我和 funkybro 有同样的问题,我现在有 706 个重复项。不能使用可可豆荚(因为它把一切都搞砸了,或者 -ObjC 标志......【参考方案5】:

我有同样的问题,在我的情况下,我有 2 个 GoogleMap.framework 参考,我删除了旧的框架参考并且问题得到了解决:)

点击项目 在 Build Phases -> Link Binary With Libraries -> 检查是否存在 GoogleMaps.framework 的任何重复引用 如果是,则删除您未添加的一个。

【讨论】:

谢谢!检查重复引用对我有帮助!【参考方案6】:
**_vImageBoxConvolve_Planar8, referenced from: (anonymous namespace)::CreateBlurredImage(CGImage*, double, double) in GoogleMaps(GLWaterGroup.o)**

This required "Accelerate.framework". So, please add it.

Steps:
1)Build Phases -> Link Bundle with Libraries.
2)Click "+",
3)Select "Accelerate.framework". Finish.

【讨论】:

【参考方案7】:

从(目标->构建设置->其他链接器标志)中删除 -all_load 标志解决了我在使用可可豆荚时遇到的问题。

【讨论】:

【参考方案8】:

如果今天有人遇到这种情况,在 Build Settings 中链接 CoreLocation.framework 二进制文件对我有用

【讨论】:

以上是关于GoogleMapsSDK:架构 x86_64 的未定义符号的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 5.1:移除 x86_64 架构

警告“将架构 arm64 映射到 x86_64”是啥意思?

架构 x86_64 / i386 的未定义符号

SDL 缺少 x86_64 架构

架构 x86_64 的 1159 个重复符号

Cordova - 架构 x86_64 的未定义符号