Problème
Étant donné que spdlog est une bibliothèque d'en-tête uniquement, la création d'une bibliothèque partagée et son utilisation dans le programme principal ne partageront pas le registre de l'enregistreur entre eux. Cela signifie que les appels à des fonctions telles que spdlog::set_level(spdlog::level::level_enum::info) ne modifieront pas le journaliseur dans la DLL.
Solution de contournement Ce que
vous pouvez faire est d'enregistrer l'enregistreur dans les deux registres.
// mylibrary.h
// 在库中,我们跳过了符号导出部分
#include <memory>
#include <vector>
#include <spdlog/spdlog.h>
#include <spdlog/logger.h>
#include <spdlog/sinks/stdout_color_sinks.h>
namespace library
{
static const std::string logger_name = "example";
std::shared_ptr<spdlog::logger> setup_logger(std::vector<spdlog::sink_ptr> sinks)
{
auto logger = spdlog::get(logger_name);
if (!logger)
{
if (sinks.size() > 0)
{
logger = std::make_shared<spdlog::logger>(logger_name,
std::begin(sinks),
std::end(sinks));
spdlog::register_logger(logger);