2

这个问题与这个问题非常相似,但是那里提到的解决方案都没有帮助。

假设我有一个共享库 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
4

1 回答 1

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();
}
于 2013-08-21T16:11:04.740 回答