- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
昨天我开始将 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/
我正在使用 spdlog 为 Visual Studio 中的托管和非托管代码运行日志。出于这个原因,我编写了在后台使用 spdlog 的 shell 类。 但是,我的单元测试遇到了问题。我的单元测试
我正在尝试在 hello world 中使用 spdlog 库。 #include "spdlog/spdlog.h" int main() { return 0; } 因为它是“仅 head
我正在进行 spdlog 的最新提交(有一个关于 std 输出的 issue,显然已解决),并且正在将我的输出从 std::cout 切换到 spdlog。 我的谷歌测试重定向 std::cout 所
我正在进行 spdlog 的最新提交(有一个关于 std 输出的 issue,显然已解决),并且正在将我的输出从 std::cout 切换到 spdlog。 我的谷歌测试重定向 std::cout 所
我需要在某些代码之前关闭 spdlog 级别,然后将其返回到之前的值。 如何在关闭之前获得当前级别? 最佳答案 要获取记录器的当前级别,请使用 logger::level() . 要设置新级别,请使用
昨天我开始将 spdlog 包含到我的个人项目中以用于日志记录。到目前为止,我在使库包含正常工作方面遇到了一些问题,但这些问题现在已完全解决。 现在一切都编译得很好,找到了所有 header ,但是当
使用 spdlog , 如何更改每日记录器的默认滚动时间? 在以下示例中,滚动仅在午夜发生: auto logger = spd::daily_logger_st("my_logger", "fl_l
我正在使用 spdlog 记录所有消息。我的日志模式是 JSON 格式。我在所有日志调用中手动转义消息。有什么方法可以在 spdlog 层自动转义消息吗? 手动转义示例: spdlog::info(e
我觉得问这个问题就像个傻瓜,因为这是我能想到的最微不足道的例子,但它阻碍了我。 我已经实现了一个非常基本的控制台和文件记录器: auto logger = spdlog::basic_logg
我正在尝试使用 spdlog在涉及windows下图书馆的项目中。我创建了两个记录器。一个用于使用库的应用程序,一个用于库本身。图书馆的记录器是从应用程序创建的,但是当图书馆想要添加一条消息时,它崩溃
我正在尝试将 spdlog 用作日志记录库,但我不想使用我的包管理器 (apt) 来安装它。我已经将 include 下的 spdlog 目录复制到我的项目目录的根目录中,但是当我尝试编译时出现包含错
我正在我的应用程序中创建 C++ 库模块。为了进行日志记录,我使用 spdlog .但是在生产环境中,我不希望我的 lib 模块进行任何日志记录。实现打开/关闭的一种方法是在我的代码中添加#ifdef
我在我的库中使用 spdlog 和 gtest。我需要将一些日志(不是 gtest 日志)从测试执行保存到文件。下面是创建记录器的代码: void createLogger() { auto
我正在使用 spdlog 在 Visual Studio 项目中进行日志记录。我在 Qt creator 中使用了相同的项目,然后 spdlog 日志记录不输出任何内容。但 std::cout 仍然有
这个问题在这里已经有了答案: What is an undefined reference/unresolved external symbol error and how do I fix it?
我正在开发 Vulkan API 的渲染器。我在使用 CMake 和 conan 包管理器正确设置项目时遇到了很大的麻烦。让我们看一下我的 conanfile.py 的依赖设置: from conan
我刚刚开始使用 spdlog 来改进我们的日志记录。我们的日志记录非常基础,所以我只是几乎逐字复制“多接收器”示例以记录到文件和控制台。 但是,即使完全按照示例进行操作,我也会得到: 错误 C2338
我是一名优秀的程序员,十分优秀!