2011-12-23 105 views
11

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

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

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

回答

5

初始化阶段是平台相关的。 在Linux的情况下,动态加载的库可以包含专门声明的符号,在加载库时将自动调用dlopen()

有关更多信息,请参阅dlopen(3)的手册页,第部分已过时的符号init()和fini()

静态初始化程序被隐式标记为__attribute__((constructor)),所以一般来说,当共享库被加载时,不必做任何特殊的事情来让它们调用。我怀疑这在其他平台上是相同或相似的。

+0

附录。 (glibc :) init/fini由运行时环境(crtS.o)提供,用于初始化静态持续时间对象并调用标记为__attribute __((构造函数))的函数,因此自行重写init/fini可能会导致问题包括由于双重符号定义而进行救援。 – 2011-12-23 15:09:02

+0

@jørgensen:这可能是他们被弃用的原因吗? – onitake 2011-12-23 15:27:19

4

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

库加载是一个平台相关的操作。

如果main不是用C++编写的话,C++运行时和C++静态对象什么时候会初始化为 ?

无所谓。它们将在主输入前被初始化。

+1

那么,'main'输入后仍然可以(手动)加载库。而且“他们将在进入主体之前初始化。”是一种误解。它是实现定义的,不管初始化静态对象是在输入“main”之前发生,还是在第一次使用之前的任何时候。但是,对于所有实际用途,是的,它们在'main'之前被初始化,或者在库被加载之后被初始化。 – jweyrich 2011-12-28 04:56:06

1

通常,共享库系统有一个自己的入口点来完成这项工作,而不是main,但DLL有一个DLLMain,其中实现可以放这样的代码。然而,在一般情况下,这不关你的事,它是你用来处理这个问题的任何编译器的工作。