重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
首先定义下模块的概念,在C++中可以认为每个二进制文件为一个模块。比如一个exe可执行程序、一个dll或so动态库。通常来说一个exe会依赖于几个dll动态库。
我们写一个带界面的聊天程序,exe为入口主程序 是主模块,它可能依赖于QtWidgets QtCore等Qt模块、libevent第三方模块、我们自己写的基础库xxbase模块。
创新互联建站2013年开创至今,是专业互联网技术服务公司,拥有项目成都网站设计、做网站、成都外贸网站建设公司网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元定安做网站,已为上家服务,为定安各地企业和个人服务,联系电话:13518219792
模块自己内部调用比较简单,因为编译环境和平台都一致,不存在不兼容的问题。如果想把我们的功能提供给其他人使用,就需要导出接口和dll二进制文件了。每种语言有自己的接口定义形式,接口在C或C++里就是一些.h头文件。头文件里定义了结构体、函数等,供其他模块调用。
也可以认为模块由接口和二进制文件组成。windows编译出来的dll肯定不能在linux上调用、32位编译出的dll又不能被64位程序调用、Debug模式和Release模式也存在很多差异。C++不像Java,Java是编译一次在任意操作系统和平台都能跑起来。C++呢?不同操作系统、不同CPU、不同系统位数、甚至不同优化参数,编译出来的二进制文件都不通用。
动态库就是编译好的、可供其他模块调用的二进制文件。在windows是dll形式,在类Unix是so形式。
动态库相比源码和静态库有以下优势:
动态库的劣势:
“接口一经发布,不允许做任何修改”这听上去很难,其实是有办法解决的。我们可以参考COM的思想,提供一个QueryInterface函数,用以查询所有接口。调用者先判断这个接口是否存在,存在则调用、不存在则给出错误提示。如果后期需要增加新接口,只需要更改下QueryInterface内部实现,就能扩展新接口。
即使把现在所有能想到的功能都抽象成接口,也免不了后期增加新功能。可以提前预留一些字段、函数,或者设计成方便扩展的形式。