`__declspec(dllexport)extern std :: string foo;`找不到链接器

时间:2016-09-29 11:06:11

标签: c++ extern dllexport

我遇到了与此处提到的相同的问题: 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以及以下行。

有人知道这个问题有一个很好的解决方法吗?

1 个答案:

答案 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

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

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