【发布时间】:2021-06-07 05:30:31
【问题描述】:
假设我们有一个程序(可执行)prog 链接到 libA 和 libB。 libA 和 libB 又链接到 libX,其中包含一个全局变量。
在下列情况下,全局变量会在prog进程中有一个实例,还是两个不同的实例?
-
prog链接到libA和libB是动态的,但是这两个链接到libX是静态的。 (我假设有两种情况?) -
prog链接到libA和libB是动态的,并且这两个链接到libX是动态的。 (我假设一个例子?) -
prog链接到libA和libB是静态链接,并且这两个链接到libX静态链接。 (我再假设一个例子?)
另外:
- 如果将全局声明为
static(翻译单元的本地),是否会有所不同?在我的用例中,它是。 - 这些问题的答案是否因操作系统而异? (macOS、Linux、Windows)
- 您能否推荐一些阅读材料来解释我自己回答类似问题所需的基本知识?
【问题讨论】:
-
为什么不检查一下?
-
@KamilCuk 我希望对该主题有更深入的了解。在单个平台上检查这个不会给我那个。
-
“静态链接到...”对我来说很奇怪。您不能与某些东西“静态链接”。静态库是目标文件的集合,您不能“与它链接”。您可以将其编译为可执行文件或共享库。静态链接基本上意味着编译。
-
@KamilCuk 我真的不想挑剔术语。你需要澄清这个问题吗?如果是,我可以尝试改进它。
-
@KamilCuk 静态链接不是编译。我可以在一台计算机上编译一个对象库并将其链接到我在另一台计算机上编译的代码。该库甚至可以用第二台计算机没有编译器的语言编译。静态和动态链接是两个独立的概念(前者在构建时,后者在运行时)。
标签: c global-variables shared-libraries static-linking dynamic-linking