OS X以及iOS平台上的的动态库导出c++接口类

来源:互联网 发布:网管软件限制 编辑:程序博客网 时间:2024/04/26 20:58

c/c++语言写的动态库可以导出classes以及functions。


下面是一些重要的知识:


1:

gcc编译器生成的动态库中的classes和functions默认都是导出的,而微软的vc的编译器必须针对classes和functions显式的使用 __declspec(export) 才能让classes和functions被导出。


这个知识对于在Linux、OS X、iOS平台上做开发是有帮助的。


2:
如果把动态库的不必要的symbols也导出的坏处是会影响app的加载的速度。

3,
在OS X、iOS上,可以通过修改编译器选项,让symbols hidden by default,然后想要导出的symbols再用 __attribute__ (( visibility("default")))。

这个表示默认所有的classes和functions不是导出的了,而用visibility指定的符号才是导出的。

4:
c++ classes的虚函数的特殊之处:

即使一个class并没有被导出,但它的虚函数也仍然能够被动态库的client调用:如果client能够从动态库得到一个该class的实例(可以通过一个被导出的function返回),那么client就能够调用它的这个虚函数。
这是因为虚函数并不需要在编译链接期间进行链接,它是运行期间通过对象实例所指向的虚函数指针表来动态寻址的。

5:
我们团队开发的多媒体引擎给app的接口设计时就利用了这个特性:提供了一组导出的functions(通过设定visibility为default),由function创建并返回给client一些抽象类的实例,这些抽象类全部定义的纯虚函数,抽象类并不需要导出(这就是利用了上文中提到的特性),另一方面,client也不需要知道具体的实现类,只需要知道抽象类的定义即可(这样的好处是面向接口编程)。








0 0