gpt4 book ai didi

c++ - 工厂方法上的 spdlog 崩溃

转载 作者:行者123 更新时间:2023-11-30 04:55:03 36 4
gpt4 key购买 nike

昨天我开始将 spdlog 包含到我的个人项目中以用于日志记录。到目前为止,我在使库包含正常工作方面遇到了一些问题,但这些问题现在已完全解决。

现在一切都编译得很好,找到了所有 header ,但是当我尝试创建记录器或简单地设置用于记录代码的模式时,代码崩溃并出现段错误。更具体地说,无论我在程序中第一次从 spdlog 命名空间调用哪个函数都会导致崩溃。

我有一个类从 spdlog(基于 this repo)中抽象出一些部分,如下所示:

//Logger.hpp
#ifndef TE_LOGGER_HPP
#define TE_LOGGER_HPP

#include <spdlog/spdlog.h>

namespace te {

class Logger {
public:
static void Init();

inline static std::shared_ptr<spdlog::logger> &getCoreLogger() {
return sCoreLogger;
}
inline static std::shared_ptr<spdlog::logger> &getClientLogger() {
return sClientLogger;
}

private:
static std::shared_ptr<spdlog::logger> sCoreLogger;
static std::shared_ptr<spdlog::logger> sClientLogger;
};

}
#endif //TE_LOGGER_HPP

//Logger.cpp
#include "Logger.hpp"
#include <spdlog/sinks/stdout_color_sinks.h>

std::shared_ptr<spdlog::logger> te::Logger::sCoreLogger;
std::shared_ptr<spdlog::logger> te::Logger::sClientLogger;

void te::Logger::Init() {
//The first of any of the following three lines cause a crash
//no matter the order, regardless of the pattern used in set_pattern
spdlog::set_pattern("%v");
sCoreLogger = spdlog::stdout_color_mt("CORE");
sClientLogger = spdlog::stdout_color_mt("CORE");

sCoreLogger->set_level(spdlog::level::trace);
sClientLogger->set_level(spdlog::level::trace);
}

从堆栈跟踪看来,问题出在 spdlog 中的 formatter 类由于某种原因在库中的某处被设置为 null .我使用的是最新的 CLion,C++14(我知道 spdlog 是 C++11,但我以后需要 14 的功能,而且设置 -std=c++11 也不能解决问题)以及截至昨天的 Ubuntu 18.04 上的最新版本的 spdlog(直接从他们的 GitHub 存储库中提取)。

编辑:根据评论中的要求,我创建了一个小项目(单个 cpp 文件,包括 spdlog 我在真实项目中所做的方式,或与中相同的代码和库设置main.cpp 文件中引用并相应链接的真实项目)旨在重现该问题,以下是我的发现:* 当我在可执行文件中直接使用 spdlog 时,问题不存在* 如果将 Logger 类移动到共享库并从那里链接到,则会出现此问题

这是我收到的错误消息:

Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)

我正在使用的 CMakeLists.txt 文件(我将库的文件嵌套到项目中,因为截至目前 CLion 不支持“同一解决方案中的多个项目”,例如 VS 支持): #CMakeLists.txt 库 cmake_minimum_required(版本 3.10 fatal error )

project(TokenEngine VERSION 0.0.1 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 14)

set(SOURCE_FILES src/Application.cpp src/Application.hpp src/EntryPoint.hpp src/Logger.cpp src/Logger.hpp)

#include_directories("${CMAKE_CURRENT_SOURCE_DIR}/libs/")
add_library(TokenEngine SHARED ${SOURCE_FILES})

target_include_directories(TokenEngine PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/libs/spdlog-1.x/include")

#Expose the public API of the engine to any project that might use it
target_include_directories(TokenEngine PUBLIC include)

#CMakeLists.txt for top level project
cmake_minimum_required(VERSION 3.10 FATAL_ERROR)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")

add_definitions(-DTE_PLATFORM_LINUX)

project(Build CXX)

add_subdirectory(TokenEngine)
add_subdirectory(Sandbox)

最佳答案

您为两个记录器使用相同的名称,当您运行它时您将得到:

$ ./logger
libc++abi.dylib: terminating with uncaught exception of type spdlog::spdlog_ex: logger with name 'CORE' already exists
Abort trap: 6

如果您将客户端记录器的名称更改为其他名称,它可以正常工作:

sCoreLogger = spdlog::stdout_color_mt("CORE");
sClientLogger = spdlog::stdout_color_mt("CLIENT");

关于c++ - 工厂方法上的 spdlog 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53301519/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com