2017-05-04 60 views
0

我遇到了一些情况,其中一些依赖代码是一个静态库。静态或全局通过链接的多个实例

我们称之为静态库“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

@descherjm是的。它们都是Visual Studio 2015中相同解决方案的一部分。该解决方案有一个可执行文件,所有文件都链接到该文件中。 –

+0

你可以把全局变量放在一个dll中吗? – drescherjm

+0

@dresherjm没有任何时间我的上司会满意。 –

回答

3

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

因此,你的DLL和你的EXE都有自己的副本,表示静态库,有自己的变量等等。唯一真正的办法是将日志记录从静态库移动到DLL,或者使其一次记录多个实例以有用和预期的方式工作。

+0

你相信梅耶的模式会有同样的不良行为?即在方法范围的静态方面呢? –

+0

是的。你可以通过实例化一个单例COM对象来解决它(然后它可以被正确共享),但这不仅仅是做一个日志DLL。 – Donnie