我正在开发一个基于插件的框架,这个插件是作为动态库实现的(在Linux上,.so文件中)。所有工作正常,直到我根据另一个插件制作插件,并且由于插件是作为专用类的静态实例实现的,我发现以下问题我简化为以下一小组代码:
liba.so的来源在这里:
class A {
public:
A(void) {
cerr << "A(" << this << ")\n";
}
};
A x;
int y;
libb.so的来源如下,取决于liba.so: extern int y;
class B {
public:
B(void) {
cerr << "B(" << this << ")\n";
y = 0;
}
};
B x;
int z;
请注意,两个类都提供了具有不同类型的相同符号x。当一个库发展并意外地使用与未知库或使用它的代码冲突的新符号时,可能会发生这种情况。
使用libb.so编写一个小程序:
extern int z;
int main(void) {
z = 0;
cerr << "main\n";
return 0;
}
执行它会给出:
casse@ares ~/tmp/tso $ ./main
A(0x7f689dfc605c)
B(0x7f689dfc605c)
main
liba.so和libb.so中的x的两个构造函数都被执行并显示&#34; this&#34;地址,他们显示相同的地址!这是正常的行为吗?静态对象的构造函数被两个具有相同名称的存储混淆似乎很奇怪。这是一个错误吗? GCC还是Linux?
感谢能帮助我的人。