c++创建并使用静态库(.lib)

静态库(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也可以)

结果打印

4、官网教程

演练:创建并使用静态库

5、#pragma comment

#pragma comment

相关推荐
FlightYe2 小时前
视界原理之3D视频(四):裸眼、眼镜和头显
android·linux·c++·3d·ffmpeg·音视频
by209993 小时前
C++ 智能指针的所有权与使用
开发语言·c++·经验分享
Rover Ramble4 小时前
C++ 用互斥锁实现读写锁
开发语言·c++
你怎么知道我是队长4 小时前
C++零基础入门第2周:数据类型、运算符与表达式完全指南(附20段可运行代码+避坑清单)
c++
say_fall4 小时前
【Linux系统编程】Ext 文件系统:磁盘与存储、文件与目录、现代计算机究竟如何寻找文件
linux·运维·服务器·数据库·c++
雪落漂泊5 小时前
C++算法 滑动窗口篇(下)
开发语言·c++
你怎么知道我是队长7 小时前
C++零基础第3周:if/else、switch、for/while/do-while 控制流完全指南(附20段可运行代码+避坑清单)
java·开发语言·c++
青少儿编程课堂8 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:倍增法求最近公共祖先LCA解析
c++·python·算法·bfs·信息学竞赛
雷✘9 小时前
C++ 类与对象的初始化机制、成员访问边界与拷贝优化
java·网络·c++
努力实干9 小时前
简单工厂模式(Simple Factory Pattern)——C++
开发语言·c++·简单工厂模式