2

MFMessageComposeViewController用来在我的视图控制器中发送消息。在导入Google Protobuf Lib之前,一切正常。但是在导入 lib 之后,我总是在以下行收到 EXC_BAD_ACCESS 错误:

MFMessageComposeViewController *messager = [[MFMessageComposeViewController alloc] init];

但是在 Debug Navigator 中,我总是得到以下堆栈,这导致我进入bool SimpleDescriptorDatabase::DescriptorIndex<Value>::AddFilemethod indescriptor_database.cpp然后进入bool InsertIfNotPresentmethod in map-util.h。两者descriptor_database.cppmap-util.h来自Google Protobuf Lib

堆

我很困惑为什么 的初始化MFMessageComposeViewControllerGoogle Protobuf Lib.

删除 lib 可以解决问题,但在我的通信引擎中需要它。

我用谷歌搜索,没有找到答案。谢谢,如果有人能引导我走向正确的方向。

我不确定这两个屏幕截图是否有帮助:

截图 1 截图 2

4

3 回答 3

4

将 protobuf 库编译器选项“Apple LLVM compiler 4.2 - Code Generation\Symbols Hidden by Default”更改为 YES 将解决此问题。

于 2013-02-18T07:04:12.093 回答
2

使用带有标志 -fvisibility=hidden(不带符号)的 gcc 编译 protobuf 对我有用(为 arm7 编译)

于 2013-04-29T13:37:43.240 回答
0

这也发生在我身上。我的堆栈跟踪不完全相同但相似。

从跟踪中可以明显看出,调用[MFMessageComposeViewController init]导致 libprotobuf.dylib 被加载。

这是苹果的dylib,所以MFMessageComposeViewController内部直接或间接依赖libprotobuf。加载它可能与您的静态版本的 protobuf 冲突。

我还没有弄清楚这是如何/为什么会发生的。

我通过将 C++ 标准库设置为 libc++ 来解决这个问题。注意:您还需要构建使用 libc++ 链接到的所有 C++ 库。当您构建它们时,请确保您设置CXX=clang++CXXFLAGS='-stdlib=libc++'.

注意:这将迫使您以 iOS 5.0+ 为目标,因为 libc++ 在早期版本的 iOS 上不可用。

于 2013-01-16T11:28:45.173 回答