在VS2015中导入/创建静态库并使用静态库【VS+Qt项目开发系列】

本项目示例源码已经上传,欢迎点击下载~

注:静态库——在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。即静态库中的指令都全部被直接包含在最终生成的 EXE 文件中了。在vs中新建生成静态库的工程,编译生成成功后,只产生一个.lib文件。

解决方案文件夹目录如下所示——我们接下来要讲的静态库模块都是在图中的Common文件夹下进行的, 如果对项目的文档架构不理解,可以先看这篇博客【VS+Qt项目开发】(三)解决方案与项目文档架构设计

注:我的解决方案路径是   C:\Users\Heylink\Documents\Visual Studio 2015\Projects\MySolution\

在VS2015中导入/创建静态库并使用静态库【VS+Qt项目开发系列】_第1张图片


1. 直接导入已有静态库

1.1 直接将已有的静态库项目拷贝到Common文件夹下,别忘了添加Output和Output\TempFile两个文件夹用以存放输出的相关文件。

注:我这里导入的静态库名字叫“Common_VS2015”,是前辈们提供的封装函数库

在VS2015中导入/创建静态库并使用静态库【VS+Qt项目开发系列】_第2张图片


1.2 在项目中导入该静态库

step1:点击解决方案——>右键——>添加——>现有项目

在VS2015中导入/创建静态库并使用静态库【VS+Qt项目开发系列】_第3张图片


step2:找到Common文件夹下的.sln文件,点击“打开”

在VS2015中导入/创建静态库并使用静态库【VS+Qt项目开发系列】_第4张图片


step3:导入成功!

在VS2015中导入/创建静态库并使用静态库【VS+Qt项目开发系列】_第5张图片


OK!导入成功啦!现在我们来看看如何自己创建静态库。


2. 自己创建静态库

什么情况下需要自己创建静态库呢?一般是为了代码的解耦合以及模块化。我们需要将一些基本的方法进行封装,方便自己以后在别的项目中使用或者提供给别的小伙伴使用。

2.1 解决方案——>右键——>添加——>新建项目——>Visual C++——>Win32项目

 注:位置选择解决方案中的Common文件夹下,名字命名为Common_VS2015

在VS2015中导入/创建静态库并使用静态库【VS+Qt项目开发系列】_第6张图片

2.2 选择静态库,预编译头和安全开发生命周期(SDL)检查可要也可不要,我们这里选择不要

在VS2015中导入/创建静态库并使用静态库【VS+Qt项目开发系列】_第7张图片

2.3 完成

2.4 添加相关文件结构/include、/source、/Output、/Output/TempFile

在VS2015中导入/创建静态库并使用静态库【VS+Qt项目开发系列】_第8张图片

/include:存放头文件

/source:存放源文件

/Output:存放输出文件

/Output/TempFile:存放中间输出文件

2.5 添加头文件、源文件

注:添加的时候位置要注意,头文件选择include文件夹,源文件选择source文件夹,添加完后源文件中代码会报错,因为分属于不同文件夹,源文件找不到头文件位置。看步骤2.6

在VS2015中导入/创建静态库并使用静态库【VS+Qt项目开发系列】_第9张图片

头文件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文件夹名字即可

注:配置和平台务必选择所有配置所有平台

在VS2015中导入/创建静态库并使用静态库【VS+Qt项目开发系列】_第10张图片

2.7 配置静态库常规属性

Common_VS2015右键——>属性——>配置属性——>常规

主要修改以下三项配置:

  •     输出目录:修改为$(SolutionDir)Common\$(ProjectName)\Output\$(Configuration)\
  •     中间目录:修改为$(SolutionDir)Common\$(ProjectName)\Output\TempFile\$(Configuration)\
  •     目标文件名:修改为common即可

点击“应用

在VS2015中导入/创建静态库并使用静态库【VS+Qt项目开发系列】_第11张图片

2.8 生成静态库

Common_VS2015右键——>生成

在VS2015中导入/创建静态库并使用静态库【VS+Qt项目开发系列】_第12张图片

配置为Debug模式


配置为Release模式


至此,静态库已经生成

3.静态库使用

3.1 检查你的项目属性是否正确

MySolution(主项目)右键——>属性

注:为了能够发布32位与64位的安装包,我们的配置最好都是设为面向所有配置+所有平台

在VS2015中导入/创建静态库并使用静态库【VS+Qt项目开发系列】_第13张图片

如果只有Win32或者x64,没有所有平台选项的话,点击右侧的配置管理器,进行新建

在VS2015中导入/创建静态库并使用静态库【VS+Qt项目开发系列】_第14张图片

3.2 将静态库源代码的头文件依赖进来,确保在编码时就能够使用而不报错

添加静态库头文件位置:$(SolutionDir)Common\Common_VS2015\include

注:上面的这个Common_VS2015要记得改为你自己的静态库项目的名称

在VS2015中导入/创建静态库并使用静态库【VS+Qt项目开发系列】_第15张图片

3.3 将静态库生成的lib文件依赖进来,确保能在编译期间使用

添加静态库lib所在的位置:$(SolutionDir)Common\Common_VS2015\Output\$(Configuration)\common.lib

如果你细心观察,你会发现这个路径就是我们之前配置的静态库项目的输出目录,没错,我们就是在这里面去拿生成的lib文件。还是那句话,注意把Common_VS2015改为你自己的静态库的名称。

在VS2015中导入/创建静态库并使用静态库【VS+Qt项目开发系列】_第16张图片

注意:从实际开发来看,选择所有配置+所有平台一般不会出问题,但是不排除还会出现以下错误

报错:LINK : fatal error LNK1181: 无法打开输入文件

“C:\Users\Heylink\Documents\VisualStudio 2015\Projects\MySolution\Common\Common_VS2015\Output\Release\\.obj”

出现该问题的情形是我在Release+x64的配置下生成主项目MySolution时碰到的,我看了一下配置

在VS2015中导入/创建静态库并使用静态库【VS+Qt项目开发系列】_第17张图片

可以发现路径最末尾少了common.lib,可是之前我的确是选择所有配置+所有平台的,所以还希望大家到时候再确认一下是否配置到位。


注意:每次添加完记得点击“应用”+“确定”

3.4 在项目中使用静态库

在前三步做完后,我们就可以在项目中使用静态库的类和函数了。

我在主项目中创建了一个简单的计算器UI,部分代码如下所示:

MySolution.h

#pragma once

#include 
#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 上右键再点击编译

然后就可以顺利运行啦~

在VS2015中导入/创建静态库并使用静态库【VS+Qt项目开发系列】_第18张图片

函数调用成功~

大功告成!

欢迎到我的GitHub主页下载项目源码~

返回《Visual Studio 2015开发Qt项目实战经验分享》

你可能感兴趣的:(C++开发)