![](/img/trans.png)
[英]linker error when archiving ios app with integrated facebook SDK
[英]Facebook Tweaks with CocoaPods linker error when archiving
我通过CocoaPods将Facebook Tweaks添加到了我的项目中,现在我想通过TestFlight与一些测试人员共享该应用程序。 默认情况下,Tweaks在Release版本中被禁用(在存档分发时使用),因此我执行了以下操作:
在预处理器宏中,我为FB_TWEAK_ENABLED
宏定义了不同的值,Facebook Tweaks库使用该宏来启用和禁用它的用法。 由于我当然不希望在Release配置中启用Tweaks(例如,对于App Store),但是我确实希望能够分发通过TestFlight启用了Tweaks的应用程序,因此我在Debug和TestFlight配置中激活了Tweaks,但在发布配置。
我通过在Debug配置中将FB_TWEAK_ENABLED
在0和1之间切换来验证激活和停用Tweaks的FB_TWEAK_ENABLED
。
到目前为止,一切正常,我可以使用我的预处理程序常量激活停用Tweaks。 我还验证了,使用不同的方案运行会按预期更改预处理器常量。
因此,无论是否启用了Tweaks,我都可以成功运行该应用程序。 但是,当我尝试对其进行存档时,它会失败并显示链接器错误:
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,还有更多这样的错误。 但我的项目,以及目标,以及在吊舱项目库和荚项目本身都有Architctures
和Valid Architectures
设置为“arm64的ARMv7 armv7s”。
记录SUPConfirmPaymentView setup
:我的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配置在模拟器或设备上运行 FB_TWEAK_ENABLED=0
FB_TWEAK_ENABLED=0
TestFlight配置在模拟器或设备上运行 FB_TWEAK_ENABLED=0
TestFlight配置存档 什么不起作用
FB_TWEAK_ENABLED=1
TestFlight配置在模拟器或设备上运行 FB_TWEAK_ENABLED=1
TestFlight配置进行存档 我不明白为什么它不起作用,因为它应该与Release配置相同(我从中复制了它),并且确实起作用,除了这个常数。 使用该常量的调试版本可以正常工作。
任何想法出什么事了吗?
编辑:感谢@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。
结果是这样的:
仅通过粘贴代码,我就已经为Debug = 1感到烦恼,这是由于Xcode的连续编译(显然使用DEBUG标志)。 但是,当使用Archive时,我得到的结果超出了我的理解,据Target所知,所有警告均来自此Archive版本。 这意味着预处理器(?)两次传递.m文件,一次是DEBUG = 1,一次是Debug = 0,这可以解释问题。 但这又引发了另外两个问题:
EDIT2:我重新创建了“ TestFlight”目标,以作为@alloy建议的Debug目标的副本。 它仍然没有构建,这很可能是由于CocoaPods没有使用调试配置。 如何使它使用调试配置? @alloy提到了有关:debug
,但是我不知道如何使用它,也没有找到任何有关它的文档。 我当前的Podfile看起来像这样(不包括项目):
platform :ios, '7.0'
pod 'AFNetworking', '~> 2.0'
pod 'Tweaks'
当将它用于我的“ TestFlight”配置时,如何使用:debug
语法使CocoaPods在调试配置中构建Tweaks库?
我认为您正在遇到这个问题: https : //github.com/CocoaPods/CocoaPods/issues/1934#issuecomment-40132425 。
(我不会交叉粘贴一个很长的答案及其所有上下文,最好是在票务跟踪器上阅读该问题。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.