gpt4 book ai didi

c++ - C++静态库中的共享全局变量 : Linux

转载 作者:太空狗 更新时间:2023-10-29 12:26:06 25 4
gpt4 key购买 nike

这在 C++ 中:

静态库“A”定义了一个全局变量 foo。

“B”和“C”是两个动态库,它们都依赖于 A,因此(静态)链接到 A。

然后 B 和 C 最终在同一个进程中加载(例如:应用程序加载 B 和 C)。

如果我们在 windows 环境中,我们将获得两个不同的 foo 实例,一个在 B 中,一个在 C 中,正如这里清楚地解释的那样:

Shared global variable in C++ static library

Linux 环境怎么样。

上下文:我们目前正在将一个windows项目移植到linux上

最佳答案

每个库都将包含一个 A 的拷贝。但是,在运行时,只有一个将被流程的所有组件使用。

// h.h
extern int a;
void b(void);
void c(void);

// a.c
#include "h.h"
int a = 0;

// b.c
#include <stdio.h>
#include "h.h"
void b(void)
{
printf("%i\n", a++);
}

// c.c
#include <stdio.h>
#include "h.h"
void c(void)
{
printf("%i\n", a++);
}

//main.c
#include <stdio.h>
#include "h.h"
int main()
{
b();
c();
}

#Makefile
main: libxc.so libxb.so
cc -o main main.c -L. -lxc -lxb
libxb.so:
cc -fPIC -shared a.c b.c -o libxb.so
libxc.so:
cc -fPIC -shared a.c c.c -o libxc.so
$make$ LD_LIBRARY_PATH=. ./main01

来自 libxa.so 的符号表:

    53: 000000000020098c     4 OBJECT  GLOBAL DEFAULT   24 a

来自libxc.so:

    53: 000000000020098c     4 OBJECT  GLOBAL DEFAULT   24 a

默认可见性是 STV_DEFAULT,根据 LSB :

STV_DEFAULT: The visibility of symbols with the STV_DEFAULT attribute is as specified by the symbol's binding type. That is, global and weak symbols are visible outside of their defining component (executable file or shared object). Local symbols are hidden, as described below. Global and weak symbols are also preemptable, that is, they may by preempted by definitions of the same name in another component.

人 5 Sprite :

STV_DEFAULT: Default symbol visibility rules. Globa and weak symbols are available to other modules; references in the local module can be interposed by definitions in other modules.

关于 SysV ABI :

When resolving symbolic references, the dynamic linker examines the symbol tables with a breadth-first search. That is, it first looks at the symbol table of the executable program itself, then at the symbol tables of the DT_NEEDED entries (in order), then at the second level DT_NEEDED entries, and so on.

如果这不是预期的结果,在符号上使用 STV_HIDDEN 可以防止它在共享对象之外可见。

相比之下,在 Windows 上,符号总是从给定的 DLL 中导入,并且默认情况下符号不会导出到其他 DLL。

关于c++ - C++静态库中的共享全局变量 : Linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39799514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com