`__declspec(dllexport) extern std::string foo;` 未被链接器找到
`__declspec(dllexport) extern std::string foo;` not found by linker
我 运行 遇到了与此处提到的相同的问题:
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.
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 和后续行。
有人知道解决这个问题的好办法吗?
确保您的编译器标志和定义的预处理器符号设置正确。
__declspec(dllexport)
应设置为创建 DLL,并且您的代码需要包含定义。如果要使用 DLL,则需要 __declspec(dllimport)
.
有关 LIBPROTOBUF_EXPORT
的定义,请参阅 port.h
文件 (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
如果您的符号定义错误,将导致编译错误。然后您仍然需要修复您的项目设置,直到满足条件。鉴于目前的信息,我帮不了你。
如果条件未触发错误并且问题仍然存在,则可能有其他原因,值得更详细地研究。
我 运行 遇到了与此处提到的相同的问题: 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.
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 和后续行。
有人知道解决这个问题的好办法吗?
确保您的编译器标志和定义的预处理器符号设置正确。
__declspec(dllexport)
应设置为创建 DLL,并且您的代码需要包含定义。如果要使用 DLL,则需要 __declspec(dllimport)
.
有关 LIBPROTOBUF_EXPORT
的定义,请参阅 port.h
文件 (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
如果您的符号定义错误,将导致编译错误。然后您仍然需要修复您的项目设置,直到满足条件。鉴于目前的信息,我帮不了你。
如果条件未触发错误并且问题仍然存在,则可能有其他原因,值得更详细地研究。