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也不需要知道具体的实现类,只需要知道抽象类的定义即可(这样的好处是面向接口编程)。