假设我有库(A)实现单例模式(它的实现中有一个静态变量).
(A)库被编译为静态库.
现在,让我说我的问题:
>(B),另一个静态库与(A)静态链接.
>(C),静态链接另一个静态库(A).
>(D),与(B)和(C)相关的顶级程序.
最后,我的单身人士真的是单身人士(我的变量真的是静态的)吗? (B)和(C)是否从(A)中找到相同的静态变量(它是unic)?或者是(A)静态链接两次嵌入(A)的代码两次最后我的静态变量(A)在最终二进制代码中出现两次这一事实?然后,如果(B)修改静态变量值,(C)将看不到变化?
注意:我在更改要静态链接而不是动态链接的项目库时遇到过这种情况.我只是想知道我是否做错了什么,或者这是否是一个正常的已知行为.
解决方法
首先:
(B)和(C)不与(A)相关联.静态库是编译的,而不是链接的.
构建(B)和(C)时,编译器可能需要查看(A)中的某些定义,但不要将其与链接混淆. (A)代码不会复制到(B)或(C)中.
其次:
(D)必须与(A),(B)和(C)联系.这意味着您只能在(D)中获得(A)代码的一个副本.
动态链接库/共享对象:
如果(B)和(C)是dlls / sos,那当然会有所不同. Dll是链接的,因此如果您将(B)和(C)构建为dll并将它们链接到(A),那么您将在(B)和(C)中分别具有(A)代码的副本.
Are (B) and (C) seing the same static variable from (A)
这取决于您的变量是否具有external or internal linkage.以下头文件包含具有内部链接的静态int变量.这意味着包含此文件的每个翻译单元都将获得它自己的myVariable副本.
//MyHeader.h #pragma once static int myVariable = 0;