我正在Linux下使用C ++开发一个共享库,我希望这个库使用log4cxx进行日志记录。但是,我不知道如何设置它。要使log4cxx工作,我需要创建一个logger对象。如何在加载库时确保创建此对象?
我怀疑最简单的方法是将logger对象创建为全局变量,然后在我的库的任何源文件中使用它,并在标题中将其声明为extern。但是,如果应用程序连接到库,我怎样才能自动创建记录器?
我知道在Windows的DLL中,存在REASON_FOR_CALL == PROCESS_ATTACH; Linux下有类似的东西吗?
答案 0 :(得分:18)
在Linux下的C ++中,只要加载库,就会自动构造全局变量。所以这可能是最简单的方法。
如果在加载库时需要调用任意函数,请使用GCC的构造函数属性:
__attribute__((constructor)) void foo(void) {
printf("library loaded!\n");
}
加载库时,动态链接器会调用构造函数。这实际上是如何实现C ++全局初始化的。
答案 1 :(得分:10)
如果您希望您的代码可移植,您应该尝试这样的事情:
namespace {
struct initializer {
initializer() {
std::cout << "Loading the library" << std::endl;
}
~initializer() {
std::cout << "Unloading the library" << std::endl;
}
};
static initializer i;
}
答案 2 :(得分:3)
使用全局(或函数中包含的局部静态)很好......但是你进入了静态初始化失败之地(实际的破坏也不是很好)。
我建议您查看Loki的Singleton实现。
有各种生命周期政策,其中一项是Phoenix
,可以帮助您避免这种惨败。
当你参与其中时,请阅读现代C ++设计,它解释了Singleton遇到的问题以及各种政策的用途。