繁体   English   中英

静态库中的静态类成员变量不共享?

[英]Static class member variable in static library not shared?

在上一个问题中 ,我描述了一个问题,一个类的静态成员变量实际上对于包括它们在内的其他不同类确实具有不同的值。

经过进一步研究,我发现包含具有静态成员变量的类的翻译单元被编译为静态库(.a扩展名)。 其他翻译单元(我称它们为插件,我在一个名为ADTF的相当复杂的框架中工作),以后会在此库中进行编译和链接。

我的问题现在是:是否期望plugin1和plugin2中的类具有自己的myGlobalBool? 当我运行程序时,从plugin1修改cMyLibraryClass :: myGlobalBool不会更改plugin2中的变量。 如果可以预料,我该怎么做使变量在插件之间共享? 请注意,我在Linux下,关于SO( 在这里这里 )的其他问题似乎指出,对于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-共享-Wl,-Bsymbolic -Wl,-无定义-共享的plugin2.os -lmyLibrary

感谢您对这里发生的事情所提出的任何建议,我已经尝试了2天。 如果您觉得我忘了提供一些必要的信息,请问一下,我会尽快将其添加到问题中! 谢谢 :-)

题:

如果可以预料,我该怎么做使变量在插件之间共享?

使myLibrary成为动态库(.so),而不是静态库(.a)。

因此,可接受的答案是解决我的问题的方法。 万一有人在ADTF(汽车数据和时间触发框架)中遇到相同的问题,那么当您知道在哪里看时,针对此问题的解决方案实际上非常简单:

在扩展名的主SConsript文件中,最后一行应显示为:

扩展名(extensionEnv,名称,sources = sources,static = True,install_headers = headers)

您只需要将static更改为false。 然后,进入build / [linux,win] / [release,debug] / $ yourextensionname并删除其中的所有内容。 还删除扩展文件夹中所有剩余的.a文件,然后从头开始重建。 而已 :-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM