静态库(Static library)通常以 .lib
后缀结尾,是一种在编译时与程序静态链接的库。它包含了一组已经编译好的目标文件(Object files),这些目标文件中包含了函数、类和其他程序实体的定义和实现。
需要注意的是,静态库中包含了所有需要的代码,因此在编译时会将静态库的代码全部复制到生成的可执行文件中,因此最终的可执行文件会比较大。与动态链接库(Dynamic library)相比,它在编译时会将库的代码与程序代码合并,而不是在运行时动态加载。
静态库的使用方式相对简单,但也有一些限制,例如无法在运行时替换库的版本,以及不能共享库的实例等
静态库的创建及使用步骤
-
编译静态库 :首先,你需要编译你的代码并生成静态库文件。这通常需要使用编译器(如 GCC、Clang 或 Visual C++)以及相应的构建工具(如 Make、CMake 等)。编译后,你会得到一个
.lib
文件。 -
使用静态库 :接下来,在你的代码中使用这个静态库。你需要在你的源文件中包含该静态库的头文件(通常是
.h
文件),并且链接静态库。对于大多数编译器,你需要告诉编译器去哪里找到这个静态库,以及需要链接哪个静态库文件。
本例工具:vs2015
1、创建空解决方案(可省略)
这一步可以不要,主要是关联静态库解决方案是测试客户端解决方案
1、新建空白解决方案
2、创建好的目录结构如下
2、创建编译静态库
1、添加静态库项目
2、创建win32项目
- 下一步
- 勾选静态库(S),取消勾选预编译头(P)
- 生成的静态库项目解决方案目录
3、添加头文件
c++
#pragma once
namespace MyStaticLib
{
class HelloTest
{
public:
static void printHello();
};
}
4、添加cpp文件
c++
#include "MyStaticLib.h"
#include <iostream>
namespace MyStaticLib
{
void HelloTest::printHello()
{
std::cout << "hello MyStaticLib.lib" << std::endl;
std::cin.get();
}
}
5、解决方案配置
我们设置为Release和x86
6、F7编译
7、生成lib库文件
3、 创建客户端使用静态库
1、添加客户端测试项目
2、创建win32控制台应用程序
- 生成的解决方案目录
3、导入静态库及头文件
我们想要使用静态库的内容,需要导入静态库的头文件
1、创建lib目录
我们可以在客户端项目client中创建一个lib目录用于存放静态库相关资源,将staticLib项目的静态库的头文件,及编译生成的lib库文件拷贝到客户端的lib目录
2、配置静态库后期生成事件
也可以配置静态库项目的属性,自动完成拷贝过程
vs
xcopy /y /d "..\$(IntDir)staticLib.lib" "..\client\lib"
xcopy /y /d "MyStaticLib.h" "..\client\lib"
配置这个属性后,我们每次编译生成静态库项目,就会自动拷贝静态库.lib和头文件到客户端的lib目录。
如,静态库项目编译生成成功后,client客户端的lib目录自动拷贝了静态库和头文件
4、使用静态库
1、添加静态库头文件
2、编写客户端测试程序
c++
// client.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
// 静态库头文件
#include "lib\MyStaticLib.h"
// 指定静态库位置
// 将库搜索记录置于对象文件中
// (可以不用在属性中配置,当然不写这行代码,在属性中配置包含目录及库也可以)
#pragma comment(lib, "lib/staticLib.lib")
int main()
{
// 调用静态库方法
MyStaticLib::HelloTest::printHello();
return 0;
}
3、编译运行客户端程序
将client设置为启动项目
开始运行(或按F5也可以)
结果打印