gpt4 book ai didi

c++ - Linux 共享库中全局变量的单个拷贝

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

问题与this one 非常相似,但是那里提到的解决方案都没有帮助。

假设我有一个共享库 B,其函数使用局部全局变量。这个函数是从第二个共享库 C 调用的。

B 和 C 都被 A 使用,我希望每个都有自己的全局变量实例,但编译器设法以某种方式将它们链接到同一个对象(与 Windows 不同)。

有人可以建议一种方法来允许我在 A 中使用不同的全局变量实例吗?

下面是我的代码。运行 a.out 时,我希望得到

1
calling from someCFunc(): 1

但是,我得到:

1
calling from someCFunc(): 2

b.h:

#ifndef _B_H_
#define _B_H_

extern "C" __attribute__ ((visibility("default"))) void myFunc();

#endif

b.cpp:

#include "b.h"
#include <iostream>

int myGlobal = 0;

extern "C" __attribute__ ((visibility("default"))) void myFunc()
{
++myGlobal;
std::cout << myGlobal << "\r\n";
}

c.h:

#ifndef _C_H_
#define _C_H_

extern "C" __attribute__ ((visibility("default"))) void someCFunc();

#endif

c.cpp

#include "c.h"
#include "b.h"
#include <iostream>

extern "C" __attribute__ ((visibility("default"))) void someCFunc()
{
std::cout << "calling from someCFunc(): ";
myFunc();
}

a.cpp:

#include "b.h"
#include "c.h"

int main(void)
{
myFunc();
someCFunc();

return 0;
}

构建脚本:

rm *.so
rm *.out
g++ -fPIC -fvisibility=hidden -shared b.cpp -o libb.so
g++ -fPIC -fvisibility=hidden -shared b.cpp -o libb2.so
g++ -fPIC -fvisibility=hidden -shared c.cpp -o libc.so -l:libb.so
g++ a.cpp -fPIC -fvisibility=hidden -l:libb2.so -l:libc.so

最佳答案

Both B and C are used by A, and I would expect each to have its own instance of the global variable

您的期望是错误的。您在这里观察到的是正确且预期的行为。如果您的预期是正确的,那么那里的每个库都会面临与臭名昭著的钻石类层次结构非常相似的问题。

Can someone suggest a method to allow me having to different instances of the global variable in A?

据我所知,这在 C++ 中是不可能的。如果你想使用不同的变量,你必须单独定义它们并将引用传递给你的函数:

// B
void myFunc(int& myVar) {
++myVar;
std::cout << myVar << "\r\n";
}

// C
int myGlobalC = 0;
void someCFunc() {
myFunc(myGlobalC);
}

// A
int myGlobalA = 0;
int main() {
myFunc(myGlobalA);
someCFunc();
}

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

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