【问题标题】:Solaris shared libraries and global variablesSolaris 共享库和全局变量
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-05-17
    • 2011-11-10
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多