我遇到了与此处提到的相同的问题: Protobuf - Refuses to link vs2013 or vs2015
我发现 generated_message_util.h 中的这两行可能会导致这个问题:
__declspec(dllexport) extern const ::std::string* empty_string_;
__declspec(dllexport) extern ProtobufOnceType empty_string_once_init_;
请参阅:https://github.com/google/protobuf/blob/master/src/google/protobuf/generated_message_util.h#L80
我不熟悉关键字extern
,但最后尝试使用该库的链接器找不到这些变量的两个定义,这些定义在 generated_message_util.cc中完成< / em>的
const ::std::string* empty_string_;
GOOGLE_PROTOBUF_DECLARE_ONCE(empty_string_once_init_);
void InitEmptyString() {
empty_string_ = new string;
...
}
请参阅:https://github.com/google/protobuf/blob/master/src/google/protobuf/generated_message_util.cc#L51以及以下行。
有人知道这个问题有一个很好的解决方法吗?
答案 0 :(得分:0)
确保正确设置了编译器标志和已定义的预处理器符号。
应该设置 __declspec(dllexport)
来创建DLL,并且您的代码需要包含定义。如果要使用DLL,则需要__declspec(dllimport)
。
有关port.h
的定义,请参阅LIBPROTOBUF_EXPORT
文件(src / google / protobuf / stubs / port.h)。这取决于LIBPROTOBUF_EXPORTS
,因此如果您想创建 DLL,请确保定义LIBPROTOBUF_EXPORTS
。如果您想使用 DLL,请确保LIBPROTOBUF_EXPORTS
未定义。
为了识别问题,您可以在项目中插入以下代码:
#ifdef LIBPROTOBUF_EXPORTS
#error defining LIBPROTOBUF_EXPORTS only allowed on DLL creation!
#endif
#ifndef PROTOBUF_USE_DLLS
#error defining PROTOBUF_USE_DLLS is required for DLL usage!
#endif
如果您的符号定义错误,将导致编译错误。然后,您仍需要修复项目设置,直到满足条件。鉴于当前的信息,我无法帮助你。
如果条件没有触发错误并且问题仍然存在,则可能还有其他事情发生,值得更详细地研究。