从C调用的C ++共享库

时间:2011-12-23 14:15:42

标签: c++ c shared-libraries portability

我有一个用C ++编写的共享库。它导出一个由extern "C"函数组成的可见界面,用于创建,销毁和操纵不透明类型。

现在,我想要一个使用这个库的纯C程序。

我可以这样做(独立平台)吗?如果main不是用C ++编写的话,C ++运行时和C ++静态对象何时初始化?

3 个答案:

答案 0 :(得分:5)

初始化阶段取决于平台。 对于Linux,动态加载的库可以具有特殊声明的符号,这些符号在加载库时由dlopen()自动调用。

请参阅dlopen(3)的联机帮助页,过时的符号init()和fini()以获取更多信息。

静态初始值设定项隐式标记为__attribute__((constructor)),因此通常在加载共享库时不必执行任何特殊操作。我怀疑在其他平台上这是相同或相似的。

答案 1 :(得分:4)

  

我可以这样做吗(平台独立)?

库加载是依赖于平台的操作。

  

C ++运行时和C ++静态对象何时初始化   如果main不是用C ++编写的?

没关系。它们将在主要输入之前初始化。

答案 2 :(得分:1)

通常,共享库系统有自己的入口点来执行此工作,而不是main,但DLL有DLLMain,其中实现可以放置此类代码。但是,在一般情况下,它不属于您的业务,而是您用于处理此问题的任何编译器的工作。