這個問題與this one非常相似,但是沒有提到的解決方案有幫助。Linux共享庫中全局變量的單個副本
假設我有一個共享庫B,其中包含一個使用本地全局變量的函數。從第二個共享庫C調用此函數。
A和B都使用B和C,我期望每個都有自己的全局變量實例,但不知何故編譯器設法將它們鏈接到指向同一個對象(不像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 "b.h"
#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 "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
c.cpp的來源是什麼? – bennofs
@bennofs - source added –