存档时,Facebook调整CocoaPods链接器错误

时间:2014-04-11 13:22:25

标签: ios xcode linker-errors cocoapods

我通过CocoaPods将Facebook Tweaks添加到我的项目中,现在我想通过TestFlight与一些测试人员共享该应用程序。默认情况下,在发布版本(在归档用于分发时使用)中调用Tweaks,因此我执行了以下操作:

  1. 创建了一个新计划" MyApp TestFlight"通过复制我原来的计划
  2. 在项目信息屏幕中添加了一个Build配置,名为" TestFlight" (除了预先配置的" Debug"和" Release"。当被问及我想继承设置的配置时,我使用了" Release"配置。
  3. 在" MyApp Testflight"方案我设置构建配置用于"存档"成为" TestFlight"。
  4. 在预处理器宏中,我为宏调整FB_TWEAK_ENABLED定义了不同的值,Facebook调整库使用它来启用和禁用它的使用。由于我肯定不想在Release配置中启用Tweaks(例如App Store),但我确实希望能够通过TestFlight分发启用Tweaks的应用程序,我在Debug和TestFlight配置中激活了Tweaks,但是不在发布配置中。 enter image description here

  5. 我确认通过在调试配置中将FB_TWEAK_ENABLED在0和1之间切换来激活和停用调整。

  6. 到目前为止一切正常,我可以使用我的预处理器常量激活一个停用调整。我还验证了,使用不同的方案运行会按预期更改预处理器常量。

    所以我可以在启用和不启用调整的情况下成功运行应用程序。但是当我尝试将其归档时,它会因链接器错误而失败:

    Undefined symbols for architecture armv7:
    "__FBTweakIdentifier", referenced from:
      ___30-[SUPConfirmPaymentView setup]_block_invoke_2 in SUPConfirmPaymentView.o
      ___30-[SUPConfirmPaymentView setup]_block_invoke_254 in SUPConfirmPaymentView.o
      ___30-[SUPConfirmPaymentView setup]_block_invoke_277 in SUPConfirmPaymentView.o
      ___30-[SUPConfirmPaymentView setup]_block_invoke_2102 in SUPConfirmPaymentView.o
      ___30-[SUPConfirmPaymentView setup]_block_invoke_2125 in SUPConfirmPaymentView.o
      ___30-[SUPConfirmPaymentView setup]_block_invoke_2150 in SUPConfirmPaymentView.o
      ___30-[SUPConfirmPaymentView setup]_block_invoke_2171 in SUPConfirmPaymentView.o
      ...
    

    ld:找不到架构armv7的符号 clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)

    对于armv7s和arm64,还有更多这样的错误。 但我的项目,目标,以及Pods项目中的库和Pods项目本身都有ArchitcturesValid Architectures设置为" arm64 armv7 armv7s"。

    对于记录:我的SUPConfirmPaymentView setup方法做了很多这样的调用:

    // setup animation constants
    FBTweakBind(self, beatEnlargementFactor, @"Confirm Payment View", @"Beat Animation", @"scale factor", 1.1, 1.0, 3.0);
    

    但我不认为这是问题,因为它在调试版本中起作用,我想它只是链接器注意到错误的第一个地方。

    那么做什么工作:

    • 使用带有FB_TWEAK_ENABLED=1
    • 的DEBUG配置在模拟器或设备上运行
    • 使用带有FB_TWEAK_ENABLED=0
    • 的DEBUG配置在模拟器或设备上运行
    • 使用REL FB_TWEAK_ENABLED=0
    • 的RELASE配置存档
    • 使用具有FB_TWEAK_ENABLED=0
    • 的TestFlight配置在模拟器或设备上运行
    • 使用具有FB_TWEAK_ENABLED=0
    • 的TestFlight配置存档

    什么不起作用

    • 使用具有FB_TWEAK_ENABLED=1
    • 的TestFlight配置在模拟器或设备上运行
    • 使用具有FB_TWEAK_ENABLED=1
    • 的TestFlight配置存档

    我不明白为什么它不起作用,因为它应该与Release配置相同(我从那里复制)并且确实有效,除了这个常量。并且使用该常量DOES的调试构建工作。

    任何想法出了什么问题?

    修改 感谢@alloy在CocoaPods上指出了这个问题:https://github.com/CocoaPods/CocoaPods/issues/1934#issuecomment-40132425 这似乎是相关的。

    因此,我在问题讨论中使用了以下代码:

    #if defined(DEBUG) && DEBUG
    #warning DEBUG=1
    #else
    #warning DEBUG=0
    #endif
    

    并将其复制到SUPConfirmPaymentView.m。

    结果如下:

    build results with warnings when using code above

    通过粘贴代码我已经得到了Debug = 1,这是由于Xcode的连续编译(显然使用了DEBUG标志)。 但是当使用Archive我得到上面的结果时,据我所知,目标下面的那些警告都是由这一个Archive构建产生的吗?这意味着预处理器(?)将.m文件传递两次,一次使用DEBUG = 1,一次使用Debug = 0,这将解释问题。 但这提出了另外两个问题:

    1. 为什么它会两次传递.m文件,如果它只是一次,因为它是.m文件(我明白为什么会发生.h文件)
    2. 为什么DEBUG = 1?它来自哪里?
    3. EDIT2: 我重新创建了我的" TestFlight"目标是@alloy建议的Debug目标的副本。它仍然没有构建,这可能是由于CocoaPods没有使用调试配置。 如何使其使用调试配置? @alloy提到了:debug的一些内容,但我不知道如何使用它,也没有找到任何关于它的文档。 我当前的Podfile看起来像这样(项目不包括在内):

      platform :ios, '7.0'
      pod 'AFNetworking', '~> 2.0'
      pod 'Tweaks' 
      

      我将如何使用:debug语法使CocoaPods在调试配置中构建Tweaks库时将其用于我的' TestFlight'配置?

1 个答案:

答案 0 :(得分:1)

你遇到了这个问题:https://github.com/CocoaPods/CocoaPods/issues/1934#issuecomment-40132425

(我不会交叉粘贴一个长答案及其所有上下文,如果您在票证跟踪器上阅读该问题,那就更好了。)