我正在尝试使用 Google 的 Protocol Buffers 为应用程序实现保存文件。
准备
创建了一个简单的测试 .proto 文件来测试功能:
message LessonFile {
optional string creator = 1;
}
创建的 .pb.cc 和 .pb.h 包含在项目中。Lib 和包含目录在项目的属性中指定。
问题
将新生成的代码包含在项目运行时导致应用程序崩溃。
通过调试崩溃状态,它指向了这个函数:
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;视窗7-64;Qt-4.8.1 + mingw,protobuf-2.4.1。
Protobuf 编译过程也存在问题:make check总是失败并显示以下消息:
在来自 ./include/gtest/gtest-param-test.h:159:0、来自 ./include/gtest/gtest.h:59、来自 src/gtest.cc:34: ./include/gtest/ 的文件中internal/gtest-param-util-generated.h:在 ::operator testing::internal::ParamGenerator() 的实例化中 const [with T = bool; T1 = 布尔值;T2 = bool]>: ./include/gtest/gtest-param-test.h:1186:28:
此处需要 ./include/gtest/internal/gtest-param-util-generated.h:80:26: 错误:未在此范围内声明,并且在实例化点通过依赖于参数的查找未找到任何声明 [ -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&)> 在这里声明,稍后在翻译单元中
尽管库和protoc.exe已成功编译并且make install创建了包含目录和 lib*.a/lib*.dll.a 文件。