`__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

如果您的符号定义错误,将导致编译错误。然后您仍然需要修复您的项目设置,直到满足条件。鉴于目前的信息,我帮不了你。

如果条件未触发错误并且问题仍然存在,则可能有其他原因,值得更详细地研究。