据我所知,一个程序(在Linux下用C ++编写)在退出main函数时调用__cxa_finalize
。我创建了一个共享库,并在main函数中使用了这个库。我想在主程序加载/卸载此库时采取一些操作。我发现在创建共享库时可以将函数__attribute__
用于此目的(此函数应在我猜的共享库代码中实现)
我添加了像:
void __attribute__ ((constructor)) my_load(void);
void __attribute__ ((destructor)) my_unload(void);
我实现了my_load和my_unload函数,如下面的链接所示: http://tdistler.com/2007/10/05/implementing-dllmain-in-a-linux-shared-library
问题是退出主函数时这些函数的处理顺序是什么? my_unload()
函数或__cxa_finalize
?
答案 0 :(得分:2)
gcc documentation for constuctor/destructor attribute说:
您可以提供可选的整数优先级来控制构造函数和析构函数的运行顺序。具有较小优先级编号的构造函数在具有较大优先级编号的构造函数之前运行;析构函数的相反关系成立。因此,如果您有一个分配资源的构造函数和一个释放相同资源的析构函数,那么这两个函数通常具有相同的优先级。 构造函数和析构函数的优先级与为命名空间范围的C ++对象指定的优先级相同。
在我使用gcc-4.7.0的测试中,构造函数在C ++全局对象构造函数之前运行,而在C ++全局对象析构函数之后运行析构函数时,两者都在同一个转换单元中,而不管声明/定义的顺序如何。
更新: Ian Lance Taylor报告未指定使用构造函数属性和C ++全局构造函数执行函数的顺序。见http://gcc.gnu.org/ml/gcc-help/2012-05/msg00118.html
在C ++中,您可以确保某个对象在任何其他全局对象之前被初始化,并在使用Schwarz Counter成语后在多个翻译单元中被销毁。
答案 1 :(得分:0)
我想在主程序加载/卸载此库时采取一些操作。
考虑使用静态类实例来实现这一点,它会更加干净和便携。
基本上,您编写了一个在其构造函数中执行初始化工作的类(并在析构函数中完成),然后声明该类的静态实例。然后,动态链接器会为您完成所有操作。
LLVM有很好的class template,它使用这种技术自动管理插件注册表,我建议从中学习。