Linux共享库中全局变量的单个副本
Single copy of global variables in Linux shared library
这个问题与这个问题非常相似,但上面提到的解决方案都没有帮助。
假设我有一个共享库B,其中有一个使用局部全局变量的函数。这个函数是从第二个共享库C.调用的
A同时使用B和C,我希望每个都有自己的全局变量实例,但编译器设法将它们链接到同一个对象(与Windows不同)。
有人能提出一种方法让我对a中全局变量的不同实例进行处理吗?
下面是我的代码。当运行a.out时,我希望得到
1
calling from someCFunc(): 1
然而,我得到:
1
calling from someCFunc(): 2
b.h:
#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 << "rn";
}
c.h:
#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;
}
构建脚本:
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 << "rn";
}
// C
int myGlobalC = 0;
void someCFunc() {
myFunc(myGlobalC);
}
// A
int myGlobalA = 0;
int main() {
myFunc(myGlobalA);
someCFunc();
}
相关文章:
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 用callgrind追踪不必要的副本
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 检查注册表项是否链接到(或副本)另一个注册表项
- Eclipse CDT:单个项目中有多个C++文件
- 为什么构建目录中新构建的共享库与安装目录中的副本具有不同的依赖项集?
- 为什么我们将单个或多维数组的大小声明为常量值?
- C++调用具有 *this 属性的单个帮助程序函数
- C++基于范围的 for 循环和元素副本
- 如何读取单个字符并在输入两个字符序列时输出? 使用 while 循环和C++
- 如何将可变参数模板转换为多个单个模板?(C++竞争编程调试模板)
- 创建提升::shared_ptr的深层副本
- 将多个 for 循环组合成单个迭代器
- 为什么初始化列表会导致2个数据副本,而不仅仅是单个副本将其传递给函数
- 为什么在C 11中推荐的值(如果需要副本),如果const引用也只花费单个副本,则建议通过值(如果需要副本)
- 多播客户端如何从发件人接收单个副本
- Linux共享库中全局变量的单个副本
- 带有单个副本的初始化std::字符串