c++ - 如何重构现在驻留在静态库中的全局记录器?

标签 c++ logging dll static-libraries

我们有一个由许多单独的 C++ 项目组成的产品 - 直到最近它们都是 DLL 项目(可执行文件除外)。

其中一些项目从未真正改变过,我们认为我们可以通过从日常解决方案中删除这些项目来减少开发人员的一些开销。然后将它们更改为构建为静态库,我们可以为开发人员提供要链接的 .lib(以及 PDB 等)。

不过,在这个过程中,我们破坏了我们的记录器——它现在位于这些静态库之一中。它被声明为全局的,我们现在创建了许多实例,而不是像以前那样创建单个实例(当它驻留在 DLL 项目中时)。拥有许多实例的主要问题是可执行项目通常会设置文件名 - 因此文件名仅为与可执行项目关联的实例设置,而不是记录器的所有其他实例(即不反射(reflect)在其他项目中的登录)在日志文件中)。

我理解为什么会发生这种情况,但我有兴趣从这里获得关于最佳前进方式的意见。

我认为,最简单的方法就是将该特定项目简单地恢复为 DLL 项目。但是,我不想这样做,因为该项目也包含其他内容。

我们可以将记录器移动到一个新的 DLL 项目中 - 这将是相当微不足道的事情,但我忍不住觉得有一个“更好”的解决方案(我想总是有 :P)。

就代码而言,在我们更改之前,记录器在 cpp 中声明如下:

static FileLogger m_fileLogger;

header (包含在所有其他项目的 PCH 中)有一个使用全局函数与 m_fileLogger 交互的宏。

我不确定为什么它被声明为static

我已经尝试在 header 中外部它,但这并没有改变行为(正如预期的那样,考虑到在记录器项目中静态链接 DLL 项目的设置)。

最佳答案

问题是每个 dll 都会加载 tge 静态库,因此代码会重复多次。您的记录器包括在内。请记住,静态库只是 .obj 文件的集合。

唯一的解决方案是将任何公共(public)代码分解为一个公共(public) dll 并在整个过程中使用它,但不止一次包含静态库是非常浪费的,并且会导致您用全局变量描述的问题。

当一个 dll 的所有代码和静态数据被加载到它自己的页面中时。即使它源自相同的 .lib,也不会尝试对相同的代码进行重复数据删除。

当谈到静态(全局)数据时,每个 dll 都将拥有自己的集合。唯一的解决方案是在公共(public) dll 中有一个拷贝。否则你会遇到问题。

关于c++ - 如何重构现在驻留在静态库中的全局记录器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40356681/

相关文章:

c++ - 当数组位于两个循环之间时,可以调用数组的 void 函数吗?

sql - 在 SQL 查询中插入日志语句

c# - 在一个应用程序中使用不同版本的 dll 文件

c# - ASP .Net 核心日志记录 - 如何过滤记录器提供程序?

mysql - Qt动态加载MySQL驱动

c++ - 构建新库时包含库中的头文件

c++ - 使用 Win32/MFC 将 HTML 文件转换为 PDF

C++:使用模板化类实现抽象类

c++ - 使用 boost 库构建 socket.io C++

c++ - 帮助配置log4cplus配置文件(properties文件)