【问题标题】:Static class member variable in static library not shared?静态库中的静态类成员变量不共享?
【发布时间】:2015-03-26 19:54:00
【问题描述】:

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

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

我现在的问题是:是否期望 plugin1 和 plugin2 中的类拥有自己的 myGlobalBool?当我运行程序时,从 plugin1 修改 cMyLibraryClass::myGlobalBool 不会更改 plugin2 中的变量。如果是预期的,我需要做什么才能使变量在插件之间共享?请注意,我在 linux 下,关于 SO(herehere)的其他一些问题似乎指出,对于 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 天了。如果您觉得我忘记提供一些重要信息,请询问,我会尽快将其添加到问题中!谢谢:-)

【问题讨论】:

    标签: c++ linux g++ static-libraries static-members


    【解决方案1】:

    问题:

    如果这是预期的,我需要做什么才能使变量在插件之间共享?

    myLibrary 设为动态库 (.so) 而不是静态库 (.a)。

    【讨论】:

    • 我也想过这个问题。不幸的是,框架为我做了这个,我无法真正改变它的编译方式,因为它必须与框架兼容。
    • 那么,您必须承受plugin1plugin2 将拥有自己的cMyLibraryClass::myGlobalBool 副本的后果。
    • 这就是我所担心的。只是为了确定,传递给 g++ 以使其共享而不是静态的参数是什么?是共享的吗?也许我可以追踪它(未)设置的位置并以某种方式对其进行修改......
    • 哇,我简直不敢相信,我实际上能够修复它,现在它可以完美运行 :-) :-) 谢谢!
    【解决方案2】:

    所以,接受的答案是我的问题的解决方案。以防万一有人遇到与 ADTF(汽车数据和时间触发框架)相同的问题,当您知道在哪里查找时,解决方案实际上非常简单:

    在扩展的主 SConsript 文件中,最后一行应该是这样的:

    Extension(extensionEnv, name, sources=sources, static=True, install_headers=headers)

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

    【讨论】:

      猜你喜欢
      • 2010-11-04
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-27
      • 1970-01-01
      • 2013-07-12
      • 1970-01-01
      相关资源
      最近更新 更多