如何在Linux上初始化一个共享库

我正在Linux下开发一个使用C ++的共享库,我希望这个库使用log4cxx来进行日志logging。 不过,我不确定如何设置。 为了使log4cxx正常工作,我需要创build一个logging器对象。 我怎样才能确保这个对象是我的库加载时创build的?

我怀疑创buildlogger对象作为全局variables是最简单的,然后从我的库的任何源文件中使用它,在头文件中声明它为extern。 但是,一旦应用程序连接到库,如何自动创buildlogging器呢?

我知道在Windows的DLL中,有一样东西是REASON_FOR_CALL == PROCESS_ATTACH; 在Linux下有没有类似的东西?

在Linux下的C ++中,只要加载了库,全局变量就会自动构造出来。 所以这可能是最简单的方法。

如果需要在加载库时调用任意函数,请使用GCC的构造函数属性:

__attribute__((constructor)) void foo(void) { printf("library loaded!\n"); } 

加载库时,构造函数被动态链接器调用。 这实际上是如何实现C ++全局初始化的。

如果你想要你的代码是可移植的,你应该尝试这样的事情:

 namespace { struct initializer { initializer() { std::cout << "Loading the library" << std::endl; } ~initializer() { std::cout << "Unloading the library" << std::endl; } }; static initializer i; } 

使用一个全局(或一个本地静态包装在一个函数)是很好的…但是,然后你进入静态初始化失败的土地(实际的破坏也不是很好)。

我建议看看Loki的Singleton实现。

有各种终生政策,其中之一是Phoenix ,将帮助你避免这场惨败。

当你在这里,阅读现代C ++设计,这解释了Singleton深入遇到的问题,以及各种政策的用途。