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 共享库和全局变量的主要内容,如果未能解决你的问题,请参考以下文章