gpt4 book ai didi

c++ - 还使用 C++ 静态初始化器时的 Linux 共享库初始化和取消初始化

转载 作者:IT王子 更新时间:2023-10-29 00:41:53 27 4
gpt4 key购买 nike

我想要自动调用来初始化和取消初始化我的共享库。

在我的共享库中,由于使用了第三方代码(例如 UnitTest++),我需要对 C++ 对象进行一些静态初始化。当我的 init 函数被执行时,我需要得到保证,C++ 对象(所有链接的翻译单元)的所有静态初始化都已完成(对于 deinit 反之亦然);因此与 C++ 程序中 main() 的执行预期的条件相同。

我看过很多关于 linux 共享库 init/deinit 的信息,例如喜欢:

但是提供的解决方案不符合我的需求。在这两种方法( __attribute__((constructor)) 甚至 -Wl,-init,<function name>)中,init 函数似乎在 C++ 对象的静态初始化完全完成之前被调用。

我也玩过 __attribute__ ((init_priority(…)))喜欢:

class InitAndDeinit {
public:
InitAndDeinit() {
// Do some initialization
}
~InitAndDeinit() {
// Do some cleanup
}
} initAndDeinit __attribute__((init_priority(65535)));

但这也不会将调用置于所需的位置;即使有 __attribute__((constructor(65535))) .

我已经使用 gcc 4.6.4、4.7.3 和 4.8.1 进行了测试(4.6.4 在 __attribute__((constructor)) 的排序方面表现出略微不同的行为)。

有什么建议吗?

我目前的解决方法是提供必须由应用程序手动调用的导出函数(lib_init() 和 lib_deinit())。

最佳答案

这是一种可能的解决方案。

TU 中的静态对象按其定义顺序进行初始化。将特殊类型 T 的静态对象的定义附加到每个源文件的末尾。 T 的构造函数应该递增一个静态零初始化 成员。一旦计数器达到模块中源文件的数量(由构建脚本确定),调用您的 lib_init()

lib_deinit() 在计数器递减回零后调用。

每个库都应该有自己的T

您应该能够修改您的 makefile,这样您就不必物理地更改源文件。例如,代替 g++ -c foo.C 使用 g++ -c myspecialstaticinitcode.C -o foo.C -include foo.C 或类似的东西。

关于c++ - 还使用 C++ 静态初始化器时的 Linux 共享库初始化和取消初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19576928/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com