想一想大多数时候我们的项目是不是所有代码都会放在同一个工程中?人少的时候问题不大,但当项目越来越大,开发人员越来越多,会发觉开发、管理能让人窒息,大家都绞在一起,出问题时互相推诿责任,各自有理,这时如果按照功能模块进行分组各自开发,以库的形式提供给其他人使用,就能够最大限度的并行开发,提高工作效率,而且项目的模块也很清晰,责任一目了然,此外使用动态链接库后还能够按模块升级,编译的速度也更快。下面就介绍怎么在工程中创建和使用动态链接库。
Windows 中叫动态链接库 (Dynamic Link Library: .dll),Linux 中叫共享库 (Shared Library: .so),Mac 下后缀为 .dylib,这几种叫法实际指的是一种类型的库,这里都统称为动态链接库吧。
理解动态链接库需要理解符号的概念,符号包含函数、变量或者类,分为公有符号和私有符号:
公有符号: 在其他程序或者库使用的符号,需要根据用途使用宏进行标记:
Q_DECL_EXPORT
: 编译为动态链接库时符号要标记为Q_DECL_EXPORT
,表明是导出的符号Q_DECL_IMPORT
: 在调用动态链接库时符号要标记为Q_DECL_IMPORT
,表明是导入的符号
私有符号: 除了公有符号外的其他符号,在此库之外不应该被访问,不需要进行标记
建议: 不要在头文件中声明私有符号。
符号上的标记 Q_DECL_EXPORT
和 Q_DECL_IMPORT
不能同时存在,为了在导出和导入时使用同一个头文件, 头文件中包含下面的宏,编译时根据条件使用不同的宏就可以了:
1 |
|
为了达到了在导出和导入时使用同一个头文件的目的:
- 生成动态链接库工程的 pro 文件中添加
DEFINES += BUILD_LIB
,在编译的时候LIB
就会被替换为Q_DECL_EXPORT
- 使用动态链接库工程的 pro 文件中千万不要加
DEFINES += BUILD_LIB
,编译的时候发现没有定义BUILD_LIB
,则LIB
就会被替换为Q_DECL_IMPORT