在VS2015中导入/创建静态库并使用静态库【VS+Qt项目开发系列】
本项目示例源码已经上传,欢迎点击下载~
注:静态库——在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。即静态库中的指令都全部被直接包含在最终生成的 EXE 文件中了。在vs中新建生成静态库的工程,编译生成成功后,只产生一个.lib文件。
解决方案文件夹目录如下所示——我们接下来要讲的静态库模块都是在图中的Common文件夹下进行的, 如果对项目的文档架构不理解,可以先看这篇博客【VS+Qt项目开发】(三)解决方案与项目文档架构设计
注:我的解决方案路径是 C:\Users\Heylink\Documents\Visual Studio 2015\Projects\MySolution\
1. 直接导入已有静态库
1.1 直接将已有的静态库项目拷贝到Common文件夹下,别忘了添加Output和Output\TempFile两个文件夹用以存放输出的相关文件。
注:我这里导入的静态库名字叫“Common_VS2015”,是前辈们提供的封装函数库
1.2 在项目中导入该静态库
step1:点击解决方案——>右键——>添加——>现有项目
step2:找到Common文件夹下的.sln文件,点击“打开”
step3:导入成功!
OK!导入成功啦!现在我们来看看如何自己创建静态库。
2. 自己创建静态库
什么情况下需要自己创建静态库呢?一般是为了代码的解耦合以及模块化。我们需要将一些基本的方法进行封装,方便自己以后在别的项目中使用或者提供给别的小伙伴使用。
2.1 解决方案——>右键——>添加——>新建项目——>Visual C++——>Win32项目
注:位置选择解决方案中的Common文件夹下,名字命名为Common_VS2015
2.2 选择静态库,预编译头和安全开发生命周期(SDL)检查可要也可不要,我们这里选择不要
2.3 完成
2.4 添加相关文件结构/include、/source、/Output、/Output/TempFile
/include:存放头文件
/source:存放源文件
/Output:存放输出文件
/Output/TempFile:存放中间输出文件
2.5 添加头文件、源文件
注:添加的时候位置要注意,头文件选择include文件夹,源文件选择source文件夹,添加完后源文件中代码会报错,因为分属于不同文件夹,源文件找不到头文件位置。看步骤2.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;
}
}
2.6 配置头文件路径
Common_VS2015右键——>属性——>C/C++常规;在附加包含目录处填写include文件夹名字即可
注:配置和平台务必选择所有配置、所有平台
2.7 配置静态库常规属性
Common_VS2015右键——>属性——>配置属性——>常规
主要修改以下三项配置:
- 输出目录:修改为$(SolutionDir)Common\$(ProjectName)\Output\$(Configuration)\
- 中间目录:修改为$(SolutionDir)Common\$(ProjectName)\Output\TempFile\$(Configuration)\
- 目标文件名:修改为common即可
点击“应用”
2.8 生成静态库
Common_VS2015右键——>生成
配置为Debug模式
配置为Release模式
至此,静态库已经生成
3.静态库使用
3.1 检查你的项目属性是否正确
MySolution(主项目)右键——>属性
注:为了能够发布32位与64位的安装包,我们的配置最好都是设为面向所有配置+所有平台
如果只有Win32或者x64,没有所有平台选项的话,点击右侧的配置管理器,进行新建
3.2 将静态库源代码的头文件依赖进来,确保在编码时就能够使用而不报错
添加静态库头文件位置:$(SolutionDir)Common\Common_VS2015\include
注:上面的这个Common_VS2015要记得改为你自己的静态库项目的名称
3.3 将静态库生成的lib文件依赖进来,确保能在编译期间使用
添加静态库lib所在的位置:$(SolutionDir)Common\Common_VS2015\Output\$(Configuration)\common.lib
如果你细心观察,你会发现这个路径就是我们之前配置的静态库项目的输出目录,没错,我们就是在这里面去拿生成的lib文件。还是那句话,注意把Common_VS2015改为你自己的静态库的名称。
注意:从实际开发来看,选择所有配置+所有平台一般不会出问题,但是不排除还会出现以下错误
报错:LINK : fatal error LNK1181: 无法打开输入文件
“C:\Users\Heylink\Documents\VisualStudio 2015\Projects\MySolution\Common\Common_VS2015\Output\Release\\.obj”
出现该问题的情形是我在Release+x64的配置下生成主项目MySolution时碰到的,我看了一下配置
可以发现路径最末尾少了common.lib,可是之前我的确是选择所有配置+所有平台的,所以还希望大家到时候再确认一下是否配置到位。
注意:每次添加完记得点击“应用”+“确定”
3.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));
}
3.5 运行结果
注:如果是新建项目第一次运行,那么出现如下错误
#include "ui_XXXXX.h" 出错
提示:无法打开源文件“ui_*****.h”
解决方案:在UI文件XXXXX.ui 上右键再点击编译
然后就可以顺利运行啦~
大功告成!
欢迎到我的GitHub主页下载项目源码~