10.Windows静态库与动态库制作指南

1.前言

前面我们一直提到静态库与动态库,但都只是大致说了一下,并没有过于深入的讲解。

但随着后面的C/C++学习中,你将会遇到大量的关于动态库与静态库的使用,因为各种第三方库基本都是会提供静态库或动态库的。

所以本章将详尽介绍一下在Windows平台动态库与静态库的制作流程。

请注意,不同平台的静态库与动态库并不相同,需要各自单独制作。

2.静态库

前面已经说过了静态库的作用,其主要目的是为了便于使用以及不泄露源码,很大程度上都是等价的替换了所有的源文件(.cpp),所以使用的时候我们仍然需要头文件(.h)。

还是老规矩,先建立项目,不过这次不同,得建立三个!分别为静态库项目动态库项目以及可执行程序项目

先建立个控制台的可执行项目,这就不多说了,名称就叫 day10-exe了。

这里主要讲解一下建立静态库与动态库项目的过程:

image-20231206182821917

名称就分别叫day10-staticday10-dynamic即可。

image-20231206182947057

动态库的项目就先不管了,后面再说,我们先来看静态库,其默认生成了下面这些文件:

image-20231206183014436

先来说说这些文件的作用:

  • pch : 预编译文件

所谓预编译,其意思就是把不会更改的源代码先行编译了,此后就可以直接使用,比如C++的iostream,windows的windows.h等等,我们不可能去改它们的源码,那就可以把它们包含进pch.h中,以后如果我们想使用这些标准库文件,就只需要包含pch.h即可。

不过要注意,这些官方的库一般都是已经被编译过了的,所以这样做并没有太大的用处,非要说的话,可以让我们只包含一个pch.h就能间接包含pch.h中的所有头文件,可以方便我们使用。

其最大的用处其实是对我们自己写的项目代码,有些代码文件功能是一次写好很久都不会动的,那就可以将其包含进来。

所起的作用是这些源文件将只在第一次运行时被编译,只要你后面不更改这些源文件,那就不会再编译,这可以大大减少我们编译程序的时间。

  • framework:一个框架文件,一般主要用于包含一些宏之内的东西。

可以看到pch文件的官方说明:

image-20231206183115132

其中就包含了framework.h文件。

这里还有一个宏的特殊用法:

#ifndef PCH_H
#define PCH_H

#endif //PCH_H
  1. ifndef :if not define,即如果没有定义后面这个宏。
  2. define :那我就定义这个宏
  3. endif :结束标志

ifndef 是一种宏用法,除了它,还有ifdef等,看名字也知道它是什么意思了,可以用来判断紧跟其后的这个宏被定义了没。

这个宏的名字是可以随便写的,但为了防止与其它文件定义的宏重名,所以一般就会采用本文件名大写、后面跟着后缀_H来作为宏的名字,字母H代表这是头文件(Header)。

它就和if判断语句一样,只有满足了条件才会执行里面的内容。

比如这里,只有以前没有定义过PCH_H宏,其里面包含的头文件才会被包含进来,并同时将这个宏定义了。

这是为了避免重复包含,比如这里包含了两次

#include<pch.h>
#include<pch.h>

但展开后其实是:

#ifndef PCH_H
#define PCH_H
//头文件
#endif //PCH_H

#ifndef PCH_H
#define PCH_H
//头文件
#endif //PCH_H

这样就只包含了上面一段,下面这段就被编译器给忽略了,因为上面那段已经定义了宏。

作者:余识
全部文章:0
会员文章:0
总阅读量:0
c/c++pythonrustJavaScriptwindowslinux