Solaris 共享库和全局变量

Posted

技术标签:

【中文标题】Solaris 共享库和全局变量【英文标题】:Solaris shared libraries and global variables 【发布时间】:2011-03-28 16:31:42 【问题描述】:

我对 Solaris 上共享库中的全局变量有疑问。 考虑以下示例:

class Foo

public:
 Foo()  Init(); 

private:
  void Init()  // do something 
;

我在共享库中有一些代码:

Foo g_Foo;

我注意到 Foo 构造函数从不在 Solaris 上调用,而相同的代码在 Linux 上运行。

我正在使用 gcc 3.4.3 和 Sun 链接器。

【问题讨论】:

你能发布你实际在做什么的完整代码吗?我认为操作系统没有问题。 我会同意的。过去,我在 Solaris 下经常使用这个习语,并且一直有效。 (诚​​然,我通常使用 Sun CC 编译,但我真的不认为 g++ 是问题。) 你确定这是场景吗?您发布的代码似乎很好。但是你提到的行为让我猜到“静态初始化惨败”,但你发布的代码并没有这么说。 我正在将一些代码移植到 Solaris。我可以用上面的示例重现该问题。还有一点需要注意 - 编译为静态库的相同代码没有这个问题。可以通过将 Init 更改为 public 并从库初始化函数(-z initarray=init_lib)中调用它来解决,但并非适用于所有情况 你确定你的库正在加载吗?我已经看到env 被搞砸的问题,并加载了旧版本的开发.so,或者存在静态和动态版本的lib,并且它编译时使用了错误的版本。我已经离开 solaris 很长时间了,以至于我忘记了一些命令,但是您可以在可执行文件上运行命令以查看运行时将使用哪些库(它会打印每个 .so 的完整路径信息) 【参考方案1】:

您是否使用 -G 标志创建共享对象?例如 CC -G -o mylib.so myfile.cpp

如果不指定-G,那么编译器可能无法正确初始化全局变量。请参阅编译器文档here。

请注意,文档还说您不能使用 ld,但需要使用 CC 进行链接。

【讨论】:

以上是关于Solaris 共享库和全局变量的主要内容,如果未能解决你的问题,请参考以下文章

是共享库/dll中的全局变量,跨进程共享

术语“共享变量”是啥意思?它与“全局变量”有何不同?

使用具有共享全局变量的线程

不同的静态全局变量共享相同的内存地址

Vue总结第六天:Vuex (全局变量管理~多个页面共享数据)

如何通过多进程共享(或排除共享)全局变量?