当前位置: 首页 > 面试题库 >

如何在Linux上初始化共享库

卢鸿博
2023-03-14
问题内容

我正在Linux下使用C
++开发共享库,并且我希望该库使用log4cxx进行日志记录。但是,我不确定该如何设置。为了使log4cxx正常工作,我需要创建一个记录器对象。我如何确保在加载库时创建了该对象?

我怀疑将记录器对象创建为全局变量,然后从我的库的任何源文件中使用它,在标头中将其声明为extern,将是最容易的。但是,一旦应用程序连接到库,如何自动创建记录器?

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


问题答案:

在Linux下的C ++中,加载库后,就会自动构造全局变量。因此,这可能是最简单的方法。

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

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

加载库时,动态链接程序将调用构造函数。实际上,这就是实现C ++全局初始化的方式。



 类似资料:
  • 问题内容: Debian不再为gTest提供任何预编译的软件包。他们建议您将框架集成到项目的makefile中。但是我想保持我的makefile干净。如何像以前的版本(<1.6.0)一样设置gTest,以便可以链接到库? 问题答案: 开始之前,请确保您已阅读并理解 Google的注释! 1.获取googletest框架 或手工获取。我不会保留这小小的“操作方法”,因此,如果您偶然发现了它,并且链接

  • 问题内容: 我正在将我的Caffe网络移植到TensorFlow上,但似乎没有进行初始化的工作。我正在使用,但这似乎使训练变得更加困难。 问题答案: 在 Tensorflow 2.0 和 更高版本中 ,和均已弃用。为了进行Xavier初始化,您现在必须切换到: Glorot制服和Xavier制服是同一初始化类型的两个不同名称。如果您想了解有关如何在带有或不带有Keras的TF2.0中使用初始化的更

  • 我正在为一个旧的Java代码库使用一个大型测试套件。长话短说,它使用DBUnit从本地硬盘上传静态只读数据集。目前,这是在每个测试级别上完成的,这意味着套件需要相当长的时间才能运行。 我试图创建一个共享的静态类,在套件级别共享。(我们也没有定义合适的测试套件——我用ClasspathSuite做了一个) 另一个问题是所有的测试都使用@RunBy(PowerMockRunner.class)——所以

  • 在“线性回归的简洁实现”一节中,我们通过init模块来初始化模型的全部参数。我们也介绍了访问模型参数的简单方法。本节将深入讲解如何访问和初始化模型参数,以及如何在多个层之间共享同一份模型参数。 我们先定义一个与上一节中相同的含单隐藏层的多层感知机。我们依然使用默认方式初始化它的参数,并做一次前向计算。与之前不同的是,在这里我们从MXNet中导入了init模块,它包含了多种模型初始化方法。 from

  • 问题内容: 有什么方法可以从Java代码中调用库中的函数吗?通常,可以在Java程序中使用Linux 库吗? 问题答案: 答案是“ JNI” :) 这里有几个链接: 如何在Linux上为JNI应用程序编译动态库? http://learn-from-the-guru.blogspot.com/2007/12/java-native-interface-jni-tutorial-hell.html

  • 我有一个非常基本的问题。我需要如何为ArrayList键入parrameters才能在BlueJ中使用代码?我有一个方法如下。