Выпустите правильно, используя CEREAL_REGISTER_DYNAMIC_INIT в C ++ Cereal Library - PullRequest
0 голосов
/ 02 октября 2018

Я перешел на использование файла lib и хотел правильно использовать CEREAL_REGISTER_DYNAMIC_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_accountactionsэто просто полностью составленная строка.У меня нет библиотеки или библиотеки с именем dll, но я подумал, что она используется для соединения этих двух модулей вместе?Документация редкая, и я могу использовать это неправильно.

Я получаю следующую ошибку:

1> c: \ git \ bindstone \ source \ game \ networklayer \ accountactions.cpp(13): ошибка C2084: функция 'void cereal :: detail :: dynamic_init_dummy_mv_accountactions (void)' уже имеет тело 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

1 Ответ

0 голосов
/ 10 февраля 2019

Кажется, я смог исправить это, определив CEREAL_FORCE_DYNAMIC_INIT с ранее отсутствующим CEREAL_DLL_EXPORT

До (не работает в 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 */
...