这个问题与这个问题非常相似,但是那里提到的解决方案都没有帮助。
假设我有一个共享库 B,其中包含一个使用局部全局变量的函数。这个函数是从第二个共享库 C 中调用的。
B 和 C 都被 A 使用,我希望每个都有自己的全局变量实例,但编译器设法将它们链接到同一个对象(与 Windows 不同)。
有人可以建议一种方法来允许我在 A 中使用不同的全局变量实例吗?
下面是我的代码。运行 a.out 时,我希望得到
1
calling from someCFunc(): 1
但是,我得到:
1
calling from someCFunc(): 2
:
#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";
}
通道:
#ifndef _C_H_
#define _C_H_
extern "C" __attribute__ ((visibility("default"))) void someCFunc();
#endif
cpp
#include "c.h"
#include "b.h"
#include <iostream>
extern "C" __attribute__ ((visibility("default"))) void someCFunc()
{
std::cout << "calling from someCFunc(): ";
myFunc();
}
一个.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