질문은 this one과 매우 유사하지만 거기에 언급 된 해결책은 유용하지 않았습니다.리눅스 공유 라이브러리의 전역 변수의 단일 사본
로컬 전역 변수를 사용하는 함수로 공유 라이브러리 B가 있다고 가정합니다. 이 함수는 두 번째 공유 라이브러리에서 호출됩니다.
B와 C 모두 A에서 사용되며 각자 고유 한 전역 변수 인스턴스를 가질 것으로 예상되지만 어떻게 든 컴파일러는이를 가리 키도록 링크를 관리합니다. 동일한 개체 (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";
}
채널 :
#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 - 소스가 추가되었습니다. –