c++ - 通过链接实现静态或全局的多个实例

标签 c++

我遇到过一些依赖代码是静态库的情况。

我们称它为静态库“A”。 我制作了一个 dll“B”,它链接到“A”。 可执行文件“C”链接到两者。

I think this diagram is correct:

            A  static lib
           / \
          |   B   dll
           \   \
            \---C  executable

“A”包含一个使用全局变量的记录器类。这是你公司交给你的其中一个,你看着它,然后对自己说,“哦,他妈的,真是一团糟。”

看起来“A”中的那些全局变量具有不同的地址,这取决于我是单步执行可执行模块中的代码还是单步执行 dll 模块中的代码。

当然,这会使记录器以意想不到的方式运行。

我假设静态库被复制一次到 dll 中,一次复制到可执行文件中,因此实际上有 2 个所有静态和全局的拷贝。对吗?

问题的第二部分是,让这个记录器成为 Meyer 的单例是否可以解决问题,或者方法范围内的静态是否也有不同的地址,具体取决于我从哪个模块调用?

或者,如果一个项目是动态链接的,那么让所有 50 个项目都动态链接是正确的做法吗?

最佳答案

记录的每个可执行文件当前必须已链接到静态库中。请注意,DLL 在这里被视为可执行文件。

因此,您的 DLL 和 EXE 都有自己的静态库拷贝,以及自己的变量等等。您唯一真正的办法是将日志记录从静态库移动到 DLL,或者使多个实例以有用且预期的方式同时进行日志记录。

关于c++ - 通过链接实现静态或全局的多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43788009/

相关文章:

c++ - i =++i 等的未定义行为规则

c++ - long long 和 long int 有什么区别

c++ - 如何处理 RapidXml 错误?

java - 如果我来自 PHP/Java,在学习 C++ 时会遇到什么问题?

c++ - Netbeans C++ 中的调试无法启动 - OSX Yosemite -

c++ - 如何准备在 Windows 和 Unix 系统上进行编译的代码库

c++ - 以下是否等同于前向声明?

php - 在 Windows 上为要在 PHP 中使用的 C++ 静态库创建 .so 文件

c++ - FindBLAS 和 FindLAPACK 在 CMake 中的使用

c++ - 当我们在这个函数中反转字符串时,为什么 char *str 的指针没有改变?