首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确使用CEREAL_REGISTER_DYNAMIC_INIT在C++谷物库中的问题

正确使用CEREAL_REGISTER_DYNAMIC_INIT在C++谷物库中的问题
EN

Stack Overflow用户
提问于 2018-10-02 08:51:21
回答 1查看 488关注 0票数 1

我已经转到使用lib文件,并希望正确地使用CEREAL_REGISTER_DYNAMIC_INIT。我不知道是否需要使用这个,但我注意到一个问题,我的一个小脑类型没有正确地在一个单独的DLL中提取,并认为这可能有帮助。

在accountActions.h文件的末尾有以下内容:

代码语言:javascript
复制
CEREAL_FORCE_DYNAMIC_INIT(mv_clientactions);

在accountActions.cpp中,文件顶部有以下内容:

代码语言:javascript
复制
#include "clientActions.h"

#include "cereal/cereal.hpp"
#include "cereal/types/base_class.hpp"
#include "cereal/types/polymorphic.hpp"
#include "cereal/archives/adapters.hpp"

#include "cereal/archives/portable_binary.hpp"
#include "cereal/archives/json.hpp"

CEREAL_REGISTER_TYPE(CreatePlayer);
CEREAL_REGISTER_TYPE(LoginRequest);
CEREAL_REGISTER_TYPE(FindMatchRequest);
CEREAL_REGISTER_TYPE(ExpectedPlayersNoted);
CEREAL_REGISTER_DYNAMIC_INIT(mv_accountactions);

假设mv_accountactions只是一个完全由字符串组成的字符串。我没有任何命名的库或dll,但认为它是用来连接这两个单位在一起?文档很少,我可能使用得不正确。

我得到的错误是:

c:\git\bindstone\source\game\networklayer\accountactions.cpp(13):错误C2084:函数'void cereal::detail::dynamic_init_dummy_mv_accountactions(void)‘已经有一个body 1> c:\git\bindstone\source\game\networklayer\accountactions.h(127):注意:参见以前定义的'dynamic_init_dummy_mv_accountactions’

我已经检查过了,没有在其他地方使用mv_accountactions .我不知道是什么导致了这件事,也不知道如何解决。我想知道我是否甚至需要CEREAL_REGISTER_DYNAMIC_INIT,或者是否有一种安全的方法来使用它,以防我移动到DLL,而我只是滥用它。

如能提出建议,将不胜感激。

发行于此:https://github.com/USCiLab/cereal/issues/523

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-10 20:27:21

我似乎能够通过用以前缺少的CEREAL_FORCE_DYNAMIC_INIT定义CEREAL_DLL_EXPORT来修复这个问题。

之前(2017年不工作):

代码语言:javascript
复制
//! Forces dynamic initialization of polymorphic support in a
//! previously registered source file
/*! @sa CEREAL_REGISTER_DYNAMIC_INIT

    See CEREAL_REGISTER_DYNAMIC_INIT for detailed explanation
    of how this macro should be used.  The name used should
    match that for CEREAL_REGISTER_DYNAMIC_INIT. */
#define CEREAL_FORCE_DYNAMIC_INIT(LibName)              \
  namespace cereal {                                    \
  namespace detail {                                    \
    void dynamic_init_dummy_##LibName();                \
  } /* end detail */                                    \
  namespace {                                           \
    void dynamic_init_##LibName()                       \
    {                                                   \
      ::cereal::detail::dynamic_init_dummy_##LibName(); \
    }                                                   \
  } } /* end namespaces */

(固定)之后:

代码语言:javascript
复制
//! Forces dynamic initialization of polymorphic support in a
//! previously registered source file
/*! @sa CEREAL_REGISTER_DYNAMIC_INIT

    See CEREAL_REGISTER_DYNAMIC_INIT for detailed explanation
    of how this macro should be used.  The name used should
    match that for CEREAL_REGISTER_DYNAMIC_INIT. */
#define CEREAL_FORCE_DYNAMIC_INIT(LibName)              \
  namespace cereal {                                    \
  namespace detail {                                    \
    void CEREAL_DLL_EXPORT dynamic_init_dummy_##LibName();                \
  } /* end detail */                                    \
  namespace {                                           \
    void dynamic_init_##LibName()                       \
    {                                                   \
      ::cereal::detail::dynamic_init_dummy_##LibName(); \
    }                                                   \
  } } /* end namespaces */
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52605014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档