【发布时间】:2016-04-28 08:18:29
【问题描述】:
假设我有库 (A) 实现单例模式(它的实现中有一个静态变量)。
(A) 库被编译为静态库。
现在,假设我的 probject 中有:
-
(B),另一个静态库与(A)静态链接。 -
(C),另一个静态库与(A)静态链接。 -
(D),与(B)和(C)链接的顶级程序。
最后,我的单例真的是单例吗(而我的变量真的是静态的)? (B) 和 (C) 是否从 (A) 看到相同的静态变量(它是 unic)吗?或者(A) 被静态链接两次嵌入(A) 的代码两次最终导致我来自(A) 的静态变量在最终的二进制代码中出现两次?那么如果(B)修改了静态变量值,(C)就看不到变化了?
注意:我在将项目库更改为静态链接而不是动态链接时遇到过这种情况。我只是想知道我是否做错了什么,或者这是否是一种正常的已知行为。
【问题讨论】:
-
静态库基本上只是一个目标文件的存档,它像任何其他目标文件一样链接到输出文件。
-
(D) 如果需要来自 (A) 的符号,也必须链接到 (A)。 (B) 和 (C) 不包含 (A) 代码。如果 (B) 和 (C) 是 dlls/sos 会有所不同。
-
您的前两个步骤没有意义。静态库是目标代码模块的集合;它们没有“链接”到其他静态库。他们只是“在那里”。在构建 (D) 时,我看不到仅链接 (B) 和 (C) 将如何产生最终产品。当拉入需要另一个静态库的静态库时,拉取者(可执行文件的链接)有责任填写空白(在这种情况下,也链接在(A)中),这应该告诉你一些关于您的最终作品中有多少 (A)。
-
@WhozCraig:为了解决这个问题,我以
(D)链接到(A)、(B)和(C)结束。但我记得遇到过(B)和(C)没有看到(A)的静态变量的相同值的情况((B)会在此处写入一个值,而(C)不会看到该值发生变化)。据我记得,当(A)被(B)和(C)链接时,我经历过……但现在我很难重现。 -
@jpo38 如果 (B) 和 (C) 是 dynamic 模块(DLL、.so 等)并且 (A) 是 static 库。只要 (D) 不直接使用仅在 (A) 中的资源,上述相同配置也将允许您声明的 (D) 链接仅指向 (B) 和 (C)。
标签: c++ static static-libraries static-linking