Win32 - 制作静态库
简介
在Windows系统下常见的库有两种一种是以.lib为扩展名的库,也叫lib库。lib库实际上分为两种:一种是静态链接lib库或者叫做静态lib库,另一种是动态链接库dll库的lib导入库或称为lib导入库。以dll为扩展名的库叫dll库,dll库只有一种就是用于动态链接的动态链接库(也叫dll库,dll是:dynamic link library的英文单词首字母缩写)。在发展史上,动态链接库的出现晚于静态链接库的出现。
动态库与静态库的区别:
- 静态库中的代码会直接塞到EXE中,而动态库则可以被EXE动态的加载或卸载;
- 静态库中不能再包含其他的动态或静态库,而动态库则可以。
1. 制作静态库
一.如何制作一个静态库
注意:!!!!!如果你的静态库是C语言编写的,仅仅经过下述操作,你引用这个静态库也得是在C语言的环境下,如果你的静态库是C++写的,你引用这个静态库也得在C++的环境下
1.打开vs2019,创建新项目

选择静态库并创建

2.选择属性->C++->预编译头->不使用预编译头

3.这个时候把IDE给你创建好的文件全部删除,我们先不使用他们

4.创建testLib.h和testLib.cpp文件

5.编写代码(不用包含main函数,因为我们不用让他跑起来)
testLib.h
int add(int a, int b);
int sub(int a, int b);
int mul(int a, int b);
int div(int a, int b);
testLib.c
#include "testLib.h"
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
int mul(int a, int b)
{
return a * b;
}
int div(int a, int b)
{
return a / b;
}
代码写完了检查无误,我们点击生成解决方案,如果你的代码没有问题,就可以在工程文件夹的Debug目录下找到刚刚生成的.lib文件

Debug目录下刚刚生成的.lib文件

此时静态库就已经制作完成了。
2. 使用静态库
再创建一个工程,取名叫test_staticLib,这个工程是用来测试静态库的。

添加以下测试代码:
#include <stdio.h>
#include <testLib.h>
int main()
{
int a = 55;
int b = 45;
printf("%d+%d = %d\n", a, b, add(a, b));
printf("%d-%d = %d\n", a, b, sub(a, b));
printf("%dx%d = %d\n", a, b, mul(a, b));
printf("%d/%d = %d\n", a, b, div(a, b));
return 0;
}
为了让库跟着项目走我们可以在工程目录下创建一个文件夹取名叫staticLib,然后在里面分别创建两个文件夹叫include和lib,include文件夹用来存放头文件,lib文件夹用来存放静态库



附加include目录
打开项目属性-》C/C++-》附加包含目录,把include文件夹的路径包含进去
注意:这里我们写的是绝对路径,可以写相对路径:..\staticLib\include

附加lib目录
链接器-》附加库目录,把lib文件夹的路径包含进去
注意:这里我们写的是绝对路径,可以写相对路径:..\staticLib\lib

测试代码
编写好测试代码后,按Ctrl+F5编译+运行,此时会发现报错了,是因为add()函数只有声明没有实现,这个时候需要引入静态库

注意:调用静态库的程序位数(x86)也要和静态库位数(x86)一致,否则也会报”无法解析的外部命令“

引入静态库
方法1:
使用#pragma comment(lib,"StaticLib1.lib")
#include <stdio.h>
#include <testLib.h>
#pragma comment(lib,"StaticLib1.lib")
int main()
{
int a = 55;
int b = 45;
printf("%d+%d = %d\n", a, b, add(a, b));
printf("%d-%d = %d\n", a, b, sub(a, b));
printf("%dx%d = %d\n", a, b, mul(a, b));
printf("%d/%d = %d\n", a, b, div(a, b));
return 0;
}
运行结果:

方法2:
包含静态库名
项目属性-》链接器-》输入-》附加依赖项,把StaticLib1.lib文件名包含进去

这个时候可以去掉#pragma comment(lib,"StaticLib1.lib")了。
运行结果:


浙公网安备 33010602011771号