【发布时间】: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的完整路径信息)
标签: c++ global-variables solaris shared-libraries