在previous question中,我描述了一个问题,即类的静态成员变量实际上对于包括它们在内的不同其他类具有不同的值。
经过进一步研究,我发现包含带有静态成员变量的类的转换单元被编译为静态库(.a扩展名)。其他翻译单元(我们称之为插件,我在一个名为ADTF的相当复杂的框架中工作),后来编译和链接,包括这个库。
我现在的问题是:是否期望plugin1和plugin2中的类获得自己的myGlobalBool?当我运行程序时,从plugin1修改cMyLibraryClass :: myGlobalBool不会更改plugin2中的变量。如果是预期的话,我需要做什么才能使变量在插件中共享?请注意,我在Linux下,其他一些关于SO的问题(here,here)似乎指出,对于Windows .dll,这是预期的,但对我来说没有用。
我正在做的事情的例子(它比那更复杂,错误可能在其他地方):
myLibrary.h
cMyLibraryClass
{
cMyLibraryClass();
static bool myGlobalBool;
// Other static variables and stuff
}
myLibrary.cpp
include myLibrary.h
bool cMyLibraryClass::myGlobalBool;
cMyLibraryClass::cMyLibraryClass()
{
// Constructor stuff
}
// Other function implementations of cMyLibraryClass
我最终得到了
libMyLibrary.a
插件与以下选项相关联:(我删除了路径以及包含的所有其他库)
插件1:
g ++ -o plugin1.plb -shared -Wl,-Bsymbolic -Wl, - no-undefined -shared plugin1.os -lmyLibrary
插件2:
g ++ -o plugin2.plb -shared -Wl,-Bsymbolic -Wl, - no-undefined -shared plugin2.os -lmyLibrary
我很欣赏有关这里发生的事情的任何建议,我现在已经尝试了解了2天。如果您觉得我忘记提供一些基本信息,请询问,我会尽快将其添加到问题中!谢谢: - )
答案 0 :(得分:4)
问题:
如果需要,我需要做什么才能使变量在插件之间共享?
使myLibrary
成为动态库(.so)而不是静态库(.a)。
答案 1 :(得分:0)
所以,接受的答案是我的问题的解决方案。为了防止任何人遇到与ADTF(汽车数据和时间触发框架)相同的问题,当您知道在哪里寻找时,解决方案实际上非常简单:
在您的扩展程序的主要SConsript文件中,最后一行应该说:
扩展(extensionEnv,name,sources = sources,static = True,install_headers = headers)
您只需将static更改为false即可。然后,进入build / [linux,win] / [release,debug] / $ yourextensionname并删除其中的所有内容。同时删除扩展文件夹中的所有剩余.a文件,然后从头开始重建。这就是它: - )