当库静态链接时,静态变量会发生什么

jpo*_*o38 6 c++ static static-libraries static-linking

假设我有(A)实现单例模式的库(它的实现中有一个静态变量).

(A) 库被编译为静态库.

现在,让我说我的问题:

  • (B),另一个静态链接静态库(A).
  • (C),另一个静态链接静态库(A).
  • (D),一个顶层程序与(B)(C).

最后,我的单身人士真的是单身人士(我的变量真的是静态的)吗?是(B)(C)(A)(它是unic)相同的静态变量?或者(A)是静态链接两次嵌入式(A)代码的事实是否最终导致我的静态变量(A)在最终二进制代码中出现两次?那么如果(B)修改静态变量值,(C)会不会看到变化?

注意:我在更改要静态链接而不是动态链接的项目库时遇到过这种情况.我只是想知道我是否做错了什么,或者这是否是一个正常的已知行为.

Moh*_*awi 7

首先:

(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)代码的副本.

(B)和(C)是否从(A)中获得相同的静态变量

这取决于您的变量是否具有外部或内部链接.以下头文件包含带有内部链接的静态int变量.这意味着包含此文件的每个翻译单元都将获得它自己的副本myVariable.

//MyHeader.h
#pragma once
static int myVariable = 0;
Run Code Online (Sandbox Code Playgroud)