欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-14 09:31:19
...

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

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

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

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

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


1. 直接导入已有静态库

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

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

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


1.2 在项目中导入该静态库

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

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


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

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


step3:导入成功!

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


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


2. 自己创建静态库

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

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

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

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

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

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

2.3 完成

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

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

/include:存放头文件

/source:存放源文件

/Output:存放输出文件

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

2.5 添加头文件、源文件

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

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

头文件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项目开发系列】

2.7 配置静态库常规属性

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

主要修改以下三项配置:

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

点击“应用

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

2.8 生成静态库

Common_VS2015右键——>生成

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

配置为Debug模式

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

配置为Release模式

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

至此,静态库已经生成

3.静态库使用

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

可以发现路径最末尾少了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 上右键再点击编译

然后就可以顺利运行啦~

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

函数调用成功~

大功告成!

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

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