Cocoapods - Flurry & TestFlight - 架构未定义符号

20

我正在升级我的项目以使用Cocoapods,但当我尝试为iOS设备或模拟器构建项目时,出现以下错误:

Undefined symbols for architecture armv7:
  "_OBJC_CLASS_$_TestFlight", referenced from:
      objc-class-ref in PhotoPreviewViewController.o
  "_OBJC_CLASS_$_Flurry", referenced from:
      objc-class-ref in MyAppDelegate.o
      objc-class-ref in InitialSetupViewController.o
      objc-class-ref in InitialDownloadViewController.o
      objc-class-ref in HistoryViewController.o
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

(当然,架构不同)

在“链接二进制文件和库”下,libPods.a是黑色的,所以我认为那里没有任何问题。它也为它们两个都自动完成,所以我不确定为什么在编译时它找不到它们。

有什么建议吗?


听起来像是您的头文件搜索路径出了问题。请仔细检查它是否与Pods.xcconfig中的目标相同。 - MishieMoo
我正在使用 $(inherited),因此它也会拉取所有的 Pods.xcconfig 搜索路径。这样应该可以了吧? - RyanJM
我也遇到了这个问题,我只是从Cocoapods中移除了Testflight、Flurry和Parse。不值得为了让它们工作而头疼。 - rnystrom
这也是我所做的。希望我能将它保留在Cocoapods中。 - RyanJM
1
有一个解决方案!请查看我的答案,以解决问题并保持Cocoapod支持。 - Tom Redman
@RyanJM,你能检查一下正确答案吗? - quaertym
3个回答

70
以下方法对我有用:
在"构建设置(Build Settings)"中,不要覆盖"其他链接器标志(Other Linker Flags)"。如果它是加粗的,请选择它并按退格键,它应该恢复到正常状态。如果它没有解决问题,请删除所有标志,卸载并重新安装Pods即可解决。

4
就是这样!非常感谢!! - Marchy
2
请确保您的“库搜索路径”构建设置也进行了检查。这是导致问题的原因之一。 - Isaac Overacker
4
这个方法很有效。我从来不知道可以使用退格键来删除覆盖。起初,我只是删除了原本的“-ObjC”,结果变成了空白。显然,“空白”并不意味着“默认值”。 - markrickert
1
这并没有真正解释为什么这样可以解决问题。编辑或添加“其他链接器标志”可能有有效的理由。至少在TestFlight的情况下,这可能能够解决问题的原因是它确保-lTestFlight是链接器标志的一部分。如果你需要自定义链接器标志,请确保为TestFlight添加这个标志。 - Fostah
1
永远是我自己愚蠢的不断提醒。谢谢! - Ben Kreeger
显示剩余3条评论

22

出于某些原因,Cocoapods在TestFlight目标中不包括libTestFlight.a。要解决此问题,每次运行pod install时,您必须:

  1. Pods.xcodeproj项目中打开Pods-TestFlightSDK目标
  2. 打开Build Phases选项卡
  3. 通过"Add Other..."向下拉菜单中添加libTestFlight.a

libTestFlight.a可以在您的[$SRCROOT]/Pods/TestFlightsSDK文件夹中找到。

enter image description here

对Flurry执行相同的操作即可!

更新于2014年5月1日

看起来“缺少库集成”是使用--no-integrate标志(例如,pod install --no-integrate)的症状。

为了让生活更轻松,我编写了一个脚本,用于在运行pod (update|install) --no-integrate之后自动添加库

根据需要进行调整并将其添加到您的Podfile底部:

# Use post_install to automatically include required libraries
post_install do |installer_representation|
    installer_representation.project.targets.each do |target|
        if target.name == 'Pods-TestFlightSDK'
            libFile = installer_representation.project.new_file('TestFlightSDK/libTestFlight.a')
        end

        if target.name == 'Pods-Brightcove-Player-SDK'
            libFile = installer_representation.project.new_file('Brightcove-Player-SDK/Library/libBCOVPlayerSDK.a')
        end

        unless libFile.nil?
            puts "    - Adding %s to %s Frameworks Build Phases" % [libFile, target.name]
            target.frameworks_build_phase.add_file_reference(libFile)
        end
    end
end

这似乎对我在Flurry方面没有起作用。我仍然收到未定义符号错误。 - s73v3r
或许Flurry是一个单独的问题。请发布一个新问题并提供您的具体情况。 - Tom Redman
1
这个解决方案对我非常有效,我建议@s73v3r创建一个示例项目并仅集成Flurry添加libFlurry。我没有集成testflight库。 - Rajan Maharjan

1
我发现这个问题可能有几个原因:
  1. libPod.a没有包含在“链接二进制文件库”中(尝试删除引用并重新添加)
  2. 编译器找不到库。奇怪的行为,请尝试使用${PODS_ROOT}写入库的路径到“Library search path”。 (例如$(PODS_ROOT)/TestFlightSDK)
  3. 编译器找不到头文件。请尝试使用${PODS_ROOT}将路径写入头文件到“Header search path”。
希望这对您有所帮助。

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