windows中静态链接库通常是 .lib文件,在大型工程中,不同开发人员写的代码需要相互调用,首先不可能copy源码给调用者,其次一个模块可能包含多个函数,而通常一个函数就是一个.cpp会被编译成一个.obj 文件,但不一定每个函数都被写进调用代码中,如果把这些 obj 文件全部链接成exe,会产生大量冗余代码,其次就是量大后不好操作。
于是可以把多个obj 做成一个 lib 静态库,静态库会自动判断调用了其中哪些程序,用到哪个function就相当于将那个函数的实现”抄”进来(但这里的”抄”也只是抄编译好的obj 而非源码)。所以不会造成空间浪费,也省去了众多代码集合到一个项目中的编译步骤(只需要链接即可)
1.lib创建
创建后可以把所有.cpp和.h 全部去掉,只弄一个.cpp 和一个.h ,这里我把预编译头也去掉了。名字可以随便起无所谓。这里示例的为 MyLib.cpp 和 MyLib.h
使用海东的示例代码,.h文件包括
#pragma once
int Plus(int x, int y);
int Sub(int x, int y);
int Mul(int x, int y);
int Div(int x, int y);
.cpp文件包括: (include的是上面的.h文件)
#include "MyLib.h"
int Plus(int x, int y)
{
return x + y;
}
int Sub(int x, int y)
{
return x - y;
}
int Mul(int x, int y)
{
return x * y;
}
int Div(int x, int y)
{
return x / y;
}
点击平时的编译运行按钮,虽然提示无法运行(lib本来就无法单独运行),但已经成功生成.lib 文件了,去到 Debug 或 Release 目录下即可看到,lib 文件名和项目名一致,这里项目叫StaticLib1,生成的文件名则为StaticLib1.lib,和函数名 cpp名都无关。
2.lib调用
再创建一个平常使用的带main函数的控制台项目,用于lib的调用。把刚刚生成的.lib文件和.h 头文件都拷贝到这个项目的目录下。(提供给开发者使用的库文件都会附带头文件,否则调用者难以知道库文件的函数名和调用格式)
2.1.使用资源文件的调用
在上图中,右键资源文件->添加->现有项, 把刚刚拷贝进来的.lib文件添加,添加后资源文件会有显示,接着
调用的.cpp源码为:
#include<stdio.h>
#include"MyLib.h" //需将.h文件放入目录下才可include,
//int Plus(int x, int y); //若没有上行的include,可自行声明.h中的函数,声明与.h中的一致即可,则可不将.h拷贝进目录下
int main()
{
printf("%d\n", Plus(2, 1));
return 0;
}
运行显示为3 即调用成功
2.2.不使用资源文件的调用
用于没有上述添加资源文件的步骤,但也要将.h和.lib拷贝到目录下
就相比上述代码多加一行代码,lib名为拷贝进的文件名
#include<stdio.h>
#include"MyLib.h" //需将.h文件放入目录下才可include,
//int Plus(int x, int y); //若没有上行的include,可自行声明.h中的函数,声明与.h中的一致即可,则可不将.h拷贝进目录下
#pragma comment(lib, "StaticLib1.lib") //在项目的"资源文件"中添加相应lib文件则不用这一条
int main()
{
printf("%d\n", Plus(2, 1));
return 0;
}
运行效果一样。