除非我在调试模式下构建项目,否则第三方库崩溃

时间:2012-06-11 22:42:14

标签: ios linker xamarin.ios static-libraries

我有一个供应商提供给我们的静态库。它非常特定于我们正在转售的硬件设备。到目前为止,所有获取源代码的尝试都被供应商拒绝。我已成功创建了一个绑定接口,并使用btouch生成包装器。在调试模式下一切正常。

当我切换到没有选中调试复选框的构建配置时出现问题,它在我第一次调用绑定静态库后几秒钟崩溃。我已经彻底评论了对该库的调用,并在该过程的每一步重新构建。我可以在我第一次调用它们的库后几秒钟验证崩溃。

我甚至试图在我的调试配置中取消检查调试框,以防万一GCC参数或链接设置不同而我错过了它。当我取消选中调试框时,它会在我运行它时崩溃。

我已经看过了我能想到的所有GCC旗帜。它目前看起来像这样。

  -gcc_flags "-L${ProjectDir}/lib/Phone -lThirdPartyLibraryHere -framework Foundation -framework AudioToolbox -framework AVFoundation -framework UIKit -framework MediaPlayer -force_load ${ProjectDir}/lib/Phone/liblThirdPartyLibraryHere.a"

以下是设备的部分崩溃日志

  Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
  Exception Codes: KERN_PROTECTION_FAILURE at 0x2fd00ba0
  Crashed Thread:  0

  ...

  507 Foundation                        0x302e261c _nsnote_callback + 136
  508 CoreFoundation                    0x3041511c __CFXNotificationPost_old + 396
  509 CoreFoundation                    0x30414dbc _CFXNotificationPostNotification + 112
  510 Foundation                        0x302d1d1c -[NSNotificationCenter postNotificationName:object:userInfo:] + 64

它确实在日志中提到了CoreFoundation。我尝试将该框架链接起来,但是出现了构建错误。我找不到连接Core Foundation的例子。我不确定这是不是问题。

  -famework CoreFoundation

我尝试过-Objc标志并尝试添加几个框架。核心基础是日志中提到的,但我无法构建它。我仍然向供应商提出一个悬而未决的问题,询问他们所针对的架构,拇指模式以及框架依赖性的完整列表。我已经尝试了arm6,arm7的每个排列,以及一些其他框架。

我还应该提一下,这是从此库的先前版本升级。我使用了以前版本的要求来确定要链接的框架。他们提供了一个使用该库的演示应用程序。我尝试在演示应用程序所需的每个框架中进行链接。它已经构建但在我添加这些框架时仍然崩溃。

根据调试复选框,有谁知道为什么这会有不同的行为?我缺少什么使这项工作?

修改

供应商与我们联系并说了以下内容:

图书馆拥有的框架依赖

  • Foundation.framework
  • AVFoundation.framework
  • AudioToolbox.framework
  • MediaPlayer.framework
  • UIKit.framework(可能)

因此,我从库的最后一个版本中假设的依赖关系似乎保持不变(根据供应商的说法。)

SDK库是为armv6和armv7构建的(在构建设置中:Architectures =“armv6 $(ARCHS_STANDARD_32_BIT)”,仅构建活动架构=“否”)。我不知道这是不是问题。我尝试在属性设置下以arm6,arm7和arm6 + 7模式构建我的应用程序。

启用了Thumb模式(或者更确切地说,未明确禁用)。我不太了解这意味着什么,如果它是一个问题。我似乎记得在之前的版本(我们有源代码)上我禁用了它。

修改2

我找到了解决此问题的方法。出现问题是因为他们在库中暴露了常量。他们的头文件看起来像这样

  OBJC_EXPORT NSString * const notificationCenterEventName;

至少有十几个常量被定义为这样。

我像那样绑定那个常数

  [Field("notificationCenterEventName", "__Internal")]
  NSString NotificationCenterEventName{ get; }

我不知道我是否完全正确绑定,但是它在调试模式下工作。出于某种原因,当我取消选中调试框时,此特定绑定失败。解决方法只是在C#中使用正确的值重新定义常量,而不是消耗它们的常量。我仍然很好奇为什么这个特殊情况在调试中起作用而在发布时失败。我怀疑monotouch中的错误,还有其他想法吗?

0 个答案:

没有答案