前言
1. 本文中所有的代码案例使用Qt创建,CMake构建、Windows端使用MinGW编译、Linux端使用GNU编译。
一 库简介
1. 库是将一些写好的函数和变量代码整合在一起,编译生成库文件,以提供给程序使用。作用是为了复用代码,保护源代码。
2. 静态库
2.1 静态库在程序的链接阶段就被复制到了程序中,程序在运行时和静态库再无瓜葛。
2.2 静态库被打包到了应用程序中,加载速度更快,但占用空间更大,消耗资源更多; 更新部署时需要将全部程序重新编译链接后再发给用户。
2.3 Windows MSVC编译生成的静态库后缀名为 .lib,MinGW 编译生成的静态库后缀名为 .a;Linux 静态库的格式为 liaXXX.a
3. 动态库
3.1 动态库又名共享库,在程序运行时才被动态的加载到程序内存空间中,不占用程序的空间和资源,但加载速度相较静态库更慢。
3.2 更新部署时不需要重新编译全部程序,只更新相应的动态库即可。
3.3 导入库:动态库的 lib 文件叫导入库,和静态库不同,导入库仅包含地址符号表,用来映射动态库中的函数、变量。Linux 动态库没有导入库。3.4 Windows 动态库的后缀名为 .lib,Linux 动态库的格式为 libXXX.so
二 静态库
1. Qt 向导创建静态库的步骤
1. 点击创建项目,选择:库 ->C++ Library
2. 输入项目名称和项目创建路径
3. 选择构建工具:CMake
4. 在定义工程详情界面,选择库的类型为:Statically Linked Library(静态库)、选择用到的 Qt 模块、静态库类名、头文件和源文件
补充:Qt 模块有三个:Core、Gui、Widget4.1 Core (QtCore)是 Qt 的基础模块,提供了基本的数据结构、字符串处理、时间日期处理、文件和目录操作、流处理、国际化(i18n)支持、事件处理、线程管理、定时器、插件系统等核心功能。
4.2 Gui (QtGui)模块构建在 QtCore 之上,提供了图形用户界面的基础元素,包括颜色、字体、图标、绘图、2D 图形渲染、图像处理、窗口系统集成、事件处理(针对鼠标、键盘等输入设备)、以及基本的用户界面控件(如按钮、标签等),但不包括复杂的界面部件(如对话框、布局管理器等)。
4.3 Widgets (QtWidgets)模块是基于 QtGui 的更高层次模块,它包含了大量预建的用户界面部件(Widgets),如按钮(Button)、标签(Label)、文本框(LineEdit)、列表视图(ListView)、表格视图(TableWidget)等。
5. 选择翻译语言、编译套件、代码版本管理等
6. 静态库创建完成
2. CMakeLists.txt 设置静态库的生成路径
#注意:静态库生成路径设置应该在任何 add_library 命令之前进行
#1. 设置静态库的生成路径_ Debug 模式
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG "${CMAKE_BINARY_DIR}/../../../lib/debug")#2. 设置静态库的生成路径_ Release 模式
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE "${CMAKE_BINARY_DIR}/../../../lib/release")
3. 使用静态库的步骤
1. 在使用静态库的项目下创建一个目录:include;将静态库文件和头文件(.h)拷贝到该目录下。
2. 指定库的头文件所在路径如果使用 CMake 构建,可以直接修改 CMakeLists.txt 文件,在文件中添加以下内容:
注意:指定库的头文件所在路径要在生成使用静态库的项目之前
#指定库的头文件所在路径
include_directories(${PROJECT_SOURCE_DIR}/include)#打印变量PROJECT_SOURCE_DIR的路径
message(STATUS "PROJECT_SOURCE_DIR123456789: ${PROJECT_SOURCE_DIR}")
3. 链接静态库如果使用 CMake 构建,可以直接修改 CMakeLists.txt 文件,在文件中添加以下内容:
#注意:链接静态库要在生成使用静态库的项目之前
#指定库文件所在路径
link_directories(${PROJECT_SOURCE_DIR}/include)#链接静态库
link_libraries(libCreatorWindowsStaticLibd.a)
4. 在项目中引用库的头文件,使用库。#include "qtstaticlib.h"
QtStaticLib abc;
abc.ShowMyWindow();
4. 说明
4.1 静态库和使用静态库的项目的生成模式应该一样,要么都是 Debug;要么都是 Release。
4.2 为区分 Debug 和 Release 版本的库,Debug 版本的库名称后面一般加一个字符 'd' 进行区分。