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

时间:2013-08-21 15:40:49

标签: c++ linux gcc g++ shared-libraries

问题与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;
}

buildscript:

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

1 个答案:

答案 0 :(得分:1)

  

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

你的期望是错误的。你在这里观察的是正确和预期的行为。如果您的期望是真实的,那么每个单独的库都会遇到与臭名昭着的钻石级层次结构非常相似的问题。

  

有人可以提出一种方法,允许我在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();
}