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

假设我有库(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;

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录<future>future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...