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

前端之家收集整理的这篇文章主要介绍了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++相关文章