Linux共享库中全局变量的单个副本

Single copy of global variables in Linux shared library

本文关键字:单个 副本 全局变量 共享 Linux      更新时间:2023-10-16

这个问题与这个问题非常相似,但上面提到的解决方案都没有帮助。

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

A同时使用B和C,我希望每个都有自己的全局变量实例,但编译器设法将它们链接到同一个对象(与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 << "rn";
}

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

B和C都被A使用,我希望每个都有自己的全局变量实例

你的期望是错误的。你在这里观察到的是正确和预期的行为。如果你所期望的是真的,那么每一个库都将面临一个与臭名昭著的菱形类层次结构非常相似的问题。

有人能提出一种方法让我对a中全局变量的不同实例进行处理吗?

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

// B
void myFunc(int& myVar) {
    ++myVar;
    std::cout << myVar << "rn";
}
// C
int myGlobalC = 0;
void someCFunc() {
    myFunc(myGlobalC);
}
// A
int myGlobalA = 0;
int main() {
    myFunc(myGlobalA);
    someCFunc();
}