生成的Protobuf代码导致应用程序崩溃

3
我将翻译如下:

我正在尝试使用Google的Protocol Buffers实现应用程序的保存文件功能。

准备工作

已创建一个简单的测试.proto文件以测试功能:

message LessonFile {  
  optional string creator = 1;  
}

已创建.pb.cc和.pb.h并包含在项目中。Lib和include目录在项目属性中指定。

问题
将新生成的代码包含到项目中会导致运行时应用程序崩溃。

通过调试崩溃状态,发现问题出在这个函数上:

UnknownFieldSet::UnknownFieldSet()
    : fields_(NULL) {} ---------here---------

当框架在上方时:

LessonFile::LessonFile()
    : ::google::protobuf::Message() { ---------here---------
    SharedCtor();
}

调用栈:

google::protobuf::UnknownFieldSet::UnknownFieldSet (this=0x770e3cc3)
LessonFile (this=0xba64b30) protobuf_AddDesc_LessonFile_2eproto ()
StaticDescriptorInitializer_LessonFile_2eproto (this=0x4bc108)
__static_initialization_and_destruction_0 (__initialize_p=1, __priority=65535) global constructors keyed to _Z38protobuf_AssignDesc_LessonFile_2eprotov ()
__do_global_ctors ()
__mingw_CRTStartup () WinMainCRTStartup ()

额外信息
环境:Netbeans; Windows7-64; Qt-4.8.1 + mingw, protobuf-2.4.1。
同时还存在Protobuf编译过程中的问题:make check 不停地失败并显示以下消息:

在此处实例化时, ./include/gtest/internal/gtest-param-util-generated.h:80:26: 错误: 没有声明此范围内的“testing::internal::ParamGenerator()”,也没有找到依赖于参数的查找声明 [-fpermissive] 在文件中包含自./include/gtest/gtest.h:59:0, 来自 src/gtest.cc:34: ./include/gtest/gtest-param-test.h:288:58: 注意:后来在翻译单元中声明了 testing::internal::ParamGenerator testing::ValuesIn(const Container&)>。

虽然librariesprotoc.exe已经成功编译,并且make install已经创建了包含目录和lib*.a/lib*.dll.a文件。


我已经使用Madde shell(它与Qt一起提供)重新编译了Protobuf。还使用了额外的配置参数./configure --prefix=/c/QtSDK/mingw/,但结果仍然相同 - 执行失败,Protobuf无法处理make check。 此外,似乎应用程序退出时的错误代码(0xc0000005)被定义为“内存访问冲突”。也许有人知道这种类型的错误的信息。 - Дмитрий Званчук
我正在尝试跟踪配置过程,但似乎./configure使用的是C:/mingw而不是C:/QtSDK/mingw。两者的库不同:分别为4.7.x和4.4.0。有什么建议可以强制它使用QtSDK? - Дмитрий Званчук
我所做的是:1. 下载MingW + MSYS软件包并安装。2. 将“msys”文件夹复制到“C:\msys”,删除“C:\msys”中的“mingw”文件夹。3. 编辑“C:\msys\etc\fstab”为“C:/QtSDK/mingw /mingw”。4. 将protobuf源代码复制到“C:\msys\home\username”。5. 打开msys shell,cd到“/home/username/protobuf”。6. 运行“./configure --disable-shared”。7. “make”。8. 手动将生成的库文件复制到qt库目录(头文件也要复制)。 - Daniel Placek
FYI - MADDE 对我也没用。不过我注意到浏览它的目录时,它似乎有自己的mingw版本以及不同的库文件... 我相信它只针对移动开发。我上面描述的MSYS设置为您提供了一个漂亮的shell环境,围绕QtSDK环境。 - Daniel Placek
“make check” 进程刚通过了所有测试!如果我的应用程序成功使用 Protocol Buffers,我会通知你的。 顺便说一下,在第6步之前添加“编辑该目录中的 libstdc++.la 文件,将 library_names 的定义中的 libstdc++.dll.a 替换为 libstdc++.a”这一项(摘自 http://eschew.wordpress.com/2009/09/20/building-protobuf-with-mingw-gcc-4-4-0/)。 - Дмитрий Званчук
显示剩余2条评论
1个回答

1

为了方便后来的观众,将评论转换为答案:

  1. 下载MingW + MSYS软件包并安装。
  2. 将MingW安装文件夹中的“msys”文件夹复制到“C:\ msys”,删除“C:\ msys”中的“mingw”文件夹。
  3. 编辑“C:\ msys \ etc \ fstab”为“C:/QtSDK/mingw / mingw”
  4. 将protobuf源代码复制到“C:\ msys \ home \”
  5. 打开msys shell,cd到“/home//protobuf”
  6. http://eschew.wordpress.com/2009/09/20/building-protobuf-with-mingw-gcc-4-4-0/ - 项目#2
  7. 运行“./configure --disable-shared”
  8. 运行“make”
  9. 手动将生成的库文件复制到qt库目录中(头文件也是如此-保持目录结构)

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