注:静态库——在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。即静态库中的指令都全部被直接包含在最终生成的 EXE 文件中了。在vs中新建生成静态库的工程,编译生成成功后,只产生一个.lib文件。
解决方案文件夹目录如下所示——
注:我的解决方案路径是 C:\Users\Heylink\Documents\Visual Studio 2015\Projects\MySolution\
1. 直接导入已有静态库
(1)直接将已有的静态库项目拷贝到Common文件夹下,别忘了添加Output和Output\TempFile两个文件夹用以存放输出的相关文件。
注:我这里导入的静态库名字叫“Common_VS2015”,是前辈们提供的封装函数库
(2)在项目中导入该静态库
step1:点击解决方案——>右键——>添加——>现有项目
step2:找到Common文件夹下的.sln文件,点击“打开”
step3:导入成功!
OK!导入成功啦!现在我们来看看如何自己创建静态库。
2. 自己创建静态库
什么情况下需要自己创建静态库呢?一般是为了代码的解耦合以及模块化。我们需要将一些基本的方法进行封装,方便自己以后在别的项目中使用或者提供给别的小伙伴使用。
(1)解决方案——>右键——>添加——>新建项目——>Visual C++——>Win32项目
注:位置选择解决方案中的Common文件夹下,名字命名为Common_VS2015
(2)选择静态库,预编译头和安全开发生命周期(SDL)检查可要也可不要,我们这里选择不要
(3)完成。
(4)添加相关文件结构/include、/source、/Output、/Output/TempFile
/include:存放头文件
/source:存放源文件
/Output:存放输出文件
/Output/TempFile:存放中间输出文件
(5)添加头文件、源文件
注:添加的时候位置要注意,头文件选择include文件夹,源文件选择source文件夹,添加完后源文件中代码会报错,因为分属于不同文件夹,源文件找不到头文件位置。看步骤(6)
头文件CommonLib.h
#pragma once namespace heylink{ class CommonLib { public: CommonLib(); ~CommonLib(); int add(int n, int m); int minus(int n, int m); }; }
源文件CommonLib.cpp
#include "CommonLib.h" namespace heylink{ CommonLib::CommonLib() { } CommonLib::~CommonLib() { } int CommonLib::add(int n, int m) { return n + m; } int CommonLib::minus(int n, int m) { return n - m; } }
(6)配置头文件路径
Common_VS2015右键——>属性——>C/C++常规;在附加包含目录处填写include文件夹名字即可
注:配置和平台务必选择所有配置、所有平台
(7)配置静态库常规属性
Common_VS2015右键——>属性——>配置属性——>常规
主要修改以下三项配置:
- 输出目录:修改为$(SolutionDir)Common\Common_VS2015\Output\$(Configuration)\
- 中间目录:修改为$(SolutionDir)Common\Common_VS2015\Output\TempFile\$(Configuration)\
- 目标文件名:修改为common即可
点击“应用”
(8)生成静态库
Common_VS2015右键——>生成
配置为Debug模式
配置为Release模式
至此,静态库已经生成
3.静态库使用
(1)检查你的项目属性是否正确
MySolution(主项目)右键——>属性
注:为了能够发布32位与64位的安装包,我们的配置最好都是设为面向所有配置+所有平台
如果只有Win32或者x64,没有所有平台选项的话,点击右侧的配置管理器,进行新建
(2)将静态库源代码的头文件依赖进来,确保在编码时就能够使用而不报错
添加静态库头文件位置:$(SolutionDir)Common\Common_VS2015\include
(3)将静态库生成的lib文件依赖进来,确保能在编译期间使用
添加静态库lib所在的位置:$(SolutionDir)Common\Common_VS2015\Output\$(Configuration)\common.lib
如果你细心观察,你会发现这个路径就是我们之前配置的静态库项目的输出目录,没错,我们就是在这里面去拿生成的lib文件。
注意:每次添加完记得点击“应用”+“确定”
(4)在项目中使用静态库
在前三步做完后,我们就可以在项目中使用静态库的类和函数了。
我在主项目中创建了一个简单的计算器UI,部分代码如下所示:
MySolution.h
#pragma once #include <QtWidgets/QMainWindow> #include "ui_MySolution.h" #include "CommonLib.h" using namespace heylink; class MySolution : public QMainWindow { Q_OBJECT public: MySolution(QWidget *parent = Q_NULLPTR); ~MySolution(); private: CommonLib * m_commonLib; //静态库中的类 Ui::MySolutionClass ui; private slots: //槽函数,计算两数之和 void calcSlot(); };MySolution.cpp
#include "MySolution.h" MySolution::MySolution(QWidget *parent) : QMainWindow(parent) { ui.setupUi(this); m_commonLib = new CommonLib(); QObject::connect(ui.calcButton, SIGNAL(clicked()), this, SLOT(calcSlot())); } MySolution::~MySolution() { delete m_commonLib; } void MySolution::calcSlot() { int firstvalue = ui.firstValue->text().toInt();//取出第一个文本转化为整数类型 int secondvalue = ui.secondValue->text().toInt(); int resultvalue = m_commonLib->add(firstvalue, secondvalue);//调用静态库方法 ui.resultValue->setText(QString::number(resultvalue)); }
运行结果:
大功告成!
欢迎到我的GitHub主页下载项目源码~