这个问题与这个问题非常相似,但是没有提到的解决scheme是有帮助的。
假设我有一个使用本地全局variables的函数的共享库B. 这个函数是从第二个共享库C中调用的
B和C都被A使用,我期望每个都有它自己的全局variables实例,但不知何故,编译器设法将它们链接到指向相同的对象(与Windows不同)。
有人可以提出一种方法,让我有不同的全球变数的实例在A?
以下是我的代码。 运行a.out时,我希望得到
1 calling from someCFunc(): 1
但是,我得到:
1 calling from someCFunc(): 2
BH:
#ifndef _B_H_ #define _B_H_ extern "C" __attribute__ ((visibility("default"))) void myFunc(); #endif
b.cpp:
#include "bh" #include <iostream> int myGlobal = 0; extern "C" __attribute__ ((visibility("default"))) void myFunc() { ++myGlobal; std::cout << myGlobal << "\r\n"; }
CH:
#ifndef _C_H_ #define _C_H_ extern "C" __attribute__ ((visibility("default"))) void someCFunc(); #endif
c.cpp
#include "ch" #include "bh" #include <iostream> extern "C" __attribute__ ((visibility("default"))) void someCFunc() { std::cout << "calling from someCFunc(): "; myFunc(); }
a.cpp:
#include "bh" #include "ch" 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
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(); }