我遇到过一些依赖代码是静态库的情况。
我们称之为静态库" 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个项目会动态链接吗?
答案 0 :(得分:3)
日志中的每个可执行文件当前必须已在静态库中链接。请注意,DLL在此处被视为可执行文件。
因此,您的DLL和EXE都有自己的静态库副本,以及它们自己的变量等等。您唯一真正的办法是将日志记录从静态库移动到DLL,或者使其成为一次登录的多个实例以有用和预期的方式工作。