代码之家  ›  专栏  ›  技术社区  ›  M2tM

在C++谷类图书馆中正确使用谷类作物动态信息库

  •  0
  • M2tM  · 技术社区  · 6 年前

    我已经开始使用lib文件,并希望正确地使用core\u REGISTER\u DYNAMIC\u INIT。我不知道我是否 需要 但是我注意到一个问题,我的一个仪式化类型在一个单独的DLL中没有被正确地提取,我想这可能会有所帮助。

    在accountActions.h中,我在文件末尾有以下内容:

    CEREAL_FORCE_DYNAMIC_INIT(mv_clientactions);
    

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

    #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\u accountactions只是一个完全虚构的字符串。我没有任何库或dll命名,但我想它是用来链接这两个单位在一起?文件是稀疏的,我可能是用这个不正确。

    1>c:\git\bindstone\source\game\networklayer\accountactions.cpp(13):错误C2084:函数“void::detail::dynamic\u init\u dummy\u mv\u accountactions(void)”已经有一个主体 1>c:\git\bindstone\source\game\networklayer\accountactions.h(127):注:请参阅“dynamic\u init\u dummy\u mv\u accountactions”的先前定义

    如有建议,将不胜感激。

    https://github.com/USCiLab/cereal/issues/523

    1 回复  |  直到 6 年前
        1
  •  1
  •   M2tM    5 年前

    我似乎已经能够通过使用之前丢失的谷物DLL导出定义谷物\u力\u动态\u初始化来解决这个问题

    之前(VS 2017不工作):

    //! 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 */
    

    之后(固定):

    //! 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 */