VisualStudio2019构建C/C++静态库和动态库dll的问题 附源码

来自:互联网
时间:2021-03-24
阅读:

1. 静态库和动态库

 1.1. 静态链接库

举个例子,假如你在编写一个C++工程,根据业务逻辑,这个工程需要用到一些工具类,例如集合操作的工具类(暂且叫他collection_utils),于是你直接定义一个collection_utils.h头文件和一个collection_utils.cpp文件,在头文件中写一些工具函数的定义,在cpp文件中写函数的实现逻辑;如下所示:

//---------------collection_utils.h-----------------------------
#ifndef COLLECTION_UTILS
#define COLLECTION_UTILS
//合并两个集合
Collection mergeCollection(const Collection& c1,const Collection& c2);
#endif
//---------------collection_utils.h-----------------------------

//---------------collection_utils.cpp-----------------------------
#include "collection_utils.h"
#include <vector>
// .....
Collection mergeCollection(const Collection& c1,const Collection& c2){
	//....实现逻辑
}
//---------------collection_utils.cpp----------------

然后你发现这个工具类具有通用性,在其他项目中也有类似的工具类的需求,想让同事也用上你这个工具类,防止重复造轮子,然后你就把这两个文件发给你的同事,此时聪明的你想起来这样做有个不好的地方,因为项目编译的时候,make工具会逐个编译每个文件生成obj模块,然后通过连接器,把各个模块连接起来,然后打包生成一个exe可执行镜像,这样只要把这个工具类引入任何一个项目,它都要经历编译到obj的过程,但是对于工具类代码来说,几乎是写好了以后就不怎么变化的东西了,这样每个工程都编译一遍,岂不是浪费了时间?而且随着工具类库的增加,这种方法的弊端就会越明显。
那有没有一种方法,可以让这些工具类库代码只编译一次,让连接器在连接的时候,把已经编译好的函数直接拷贝过来,缩短项目的构建时间呢? 答案是肯定的,它就是静态链接库。
有了静态链接库,其他工程只需要在工程中引入函数声明的头文件,在连接的时候,把静态链接库的库文件提供出来就可以完成工程的构建。其实静态库很常见,例如我们用的C标准库中的math.h,如果你包含math.hstdio.h等头文件,这些头文件声明的函数实现不是每次构建工程都会把这里的代码编译一遍的,他们都是以预编译的静态链接库的形式提供,在连接的时候,把我们调用的函数代码指令,从这些库中拷贝到最终的可执行文件中。

1.1. 动态链接库

我们上面说到的静态连接库是把预编译的模块拷贝到自己的模块中,然后打包构建exe镜像,这当然节省了编译器的时间,但是从某种程度上讲,还是有些不足,因为:

  1. 在每一个构建出的每一个exe镜像中,都会有同一个函数的代码拷贝,造成额外的空间开销;
  2. 当这些静态库升级时,所有的模块都要重新编译;

那有没有一种依赖方式,可以让程序在编译时,仅仅记录调用函数的名称,函数的实现代码放在专门的一个地方,这样的库在内存中只装在一份;等到调用时,根据调用函数的名称到库中查找得到函数的入口地址呢?当然有的,那就是动态链接库(dll),顾名思义,这种类型的库是在程序运行时,需要哪个函数,就加载对应的dll到内存中,然后动态把函数调用的符号引用连接到实际的调用地址,当然这一步是由操作系统完成的啦,自己的程序不需要操心,这个比静态库要节省空间,但是会存在动态连接(把符号引用转为直接引用)的过程,对于调用性能要求较高的函数,可能会损失性能。

一般在Windows系统中,动态链接库的文件扩展名是.dll,静态链接库的名称是.lib,在linux系统中,动态库的扩展名是.so,静态库的扩展名是.a

2. 使用VisualStudio构建演示

VisualStudio 2019版本:16.8.3(社区版)

2.1. 静态库构建演示

创建一个名称为StaticDynamicLibraryStudy空白解决方案

VisualStudio2019构建C/C++静态库和动态库dll的问题 附源码
VisualStudio2019构建C/C++静态库和动态库dll的问题 附源码
VisualStudio2019构建C/C++静态库和动态库dll的问题 附源码

添加一个静态库项目

VisualStudio2019构建C/C++静态库和动态库dll的问题 附源码

项目类型选择静态库

VisualStudio2019构建C/C++静态库和动态库dll的问题 附源码

填入名称:StaticLibrary,

VisualStudio2019构建C/C++静态库和动态库dll的问题 附源码

最终新建好的项目目录结构如下:

VisualStudio2019构建C/C++静态库和动态库dll的问题 附源码

我们可以把pch.cppStaticLibrary.cpp文件删掉,添加自己的代码,举例如下:

VisualStudio2019构建C/C++静态库和动态库dll的问题 附源码

添加一个头文件,例如sayHello.h

VisualStudio2019构建C/C++静态库和动态库dll的问题 附源码

然后在源文件中新建一个源文件sayHello.cpp,实现sayHello逻辑,如下:

VisualStudio2019构建C/C++静态库和动态库dll的问题 附源码

然后,生成项目,在项目上右键,生成:

VisualStudio2019构建C/C++静态库和动态库dll的问题 附源码

然后报错了,

返回顶部
顶部