如何在Linux上初始化共享库

and*_*s-h 11 c c++ linux initialization shared-libraries

我正在Linux下使用C++开发一个共享库,我希望这个库使用log4cxx进行日志记录.但是,我不知道如何设置它.要使log4cxx工作,我需要创建一个logger对象.如何在加载库时确保创建此对象?

我怀疑最简单的方法是将logger对象创建为全局变量,然后在我的库的任何源文件中使用它,并在标题中将其声明为extern.但是,如果应用程序连接到库,我怎样才能自动创建记录器?

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

Jay*_*rod 20

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

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

__attribute__((constructor)) void foo(void) {
    printf("library loaded!\n");
}
Run Code Online (Sandbox Code Playgroud)

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


小智 10

如果您希望您的代码可移植,您应该尝试这样的事情:

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

    ~initializer() {
      std::cout << "Unloading the library" << std::endl;
    }
  };
  static initializer i;
}
Run Code Online (Sandbox Code Playgroud)