Windows/Linux下的静态库制作与使用

  • 作用
  1. 分离编译
  2. 代码重用
  • 分类
分类作用后缀Linux/Windows
静态库一个或多个.o目标文件档在一个文件中.a/ .lib
共享库没有main函数的可执行文件.so / ./dll
动态加载库没有main函数的可执行文件,接口复合API.so/ .dll

库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。

本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a.lib)和动态库(.so.dll)。

所谓静态、动态是指链接。
将一个程序编译成可执行程序的步骤:
在这里插入图片描述

0.前提(文件内容)

  • test.cpp
#include <iostream>
#include "test.h"
using namespace std;
void Func(int i){
    cout << __func__ << "(" << i << ")" << endl;
}
  • test.h
#ifndef __TEST_H_
#define __TEST_H_
void Func(int i);
#endif
  • main.cpp
#include "test.h"
int main(){
    Func();
    return 0;
}

1 静态库

1.1静态库是什么

之所以称为“静态库”,是因为在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件。因此对应的链接方式称为静态链接

静态库与汇编生成的目标文件一起链接为可执行文件,静态库必定跟.o文件格式相似。其实一个静态库可以简单看成是一组目标文件(.o/.obj文件)的集合,即很多目标文件经过压缩打包后形成的一个文件

1.2 静态库特点:

  1. 静态库对函数库的链接在编译时期完成。

  2. 程序在运行与函数库无关了,移植方便。

  3. 缺点:浪费空间和资源(所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件)。

1.3 静态库的制作与使用

1.3.1 Linux:
1.3.1.1 创建静态库

在这里插入图片描述

  • Linux静态库命名规则
    Linux静态库命名规范,必须是lib名字.alib为前缀,中间是静态库名,扩展名为.a
  • 编译源文件
g++ -c -o test.o test.cpp
  • 生成静态库
ar -rcs libtest.a test.o
  • ar选项
命令选项作用
r替换模块(replace)
c创建库(create)
s建立索引

tarar都是归档工具

  • tar用于创建.tar归档文件。
  • ar用于创建归档文件,并且为归档的目标文件中的符号建立索引。
  • 查看目标文件的符号(symbol)信息
nm 目标文件

目标文件可以是.o.a,也可以是可执行文件。

1.3.1.2 使用静态库

Linux下使用静态库,只需要在编译的时候,指定静态库的搜索路径(-L静态库的路径)指定静态库名(不需要lib前缀和.a后缀,-l静态库名)。

  • 链接静态库
g++ -o main main.cpp -L. -ltest

或者

g++ -o main main.cpp ./libtest.a
  • -L:表示要连接的库所在目录

  • -l:指定链接时需要的库,编译器查找库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.a.so来确定库的名称。

注意:库一定要放在命令行的末尾

  • 测试
./main
  • 结果
Func(100)
1.3.2 windows
1.3.2.1 创建静态库

使用VS命令行生成静态库,分两步:

  1. 通过使用带编译器选项 /c 的 Cl.exe 编译代码 (cl /c main.cpp),创建名为main.obj的目标文件。

  2. 使用库管理器 Lib.exe 链接代码 (lib main.obj),创建静态库main.lib。

当然一般不这么用,使用VS工程设置更方便。创建win32控制台程序时,勾选静态库类型;打开工程**“属性面板”->”配置属性”->”常规”,配置类型选择静态库**。
  图:vs静态库项目属性设置

Build项目即可生成静态库。

1.3.2.2 使用静态库

测试代码Linux下面的一样。有3种使用方法:

方法一:

在VS中使用静态库方法:

  • 工程“属性面板”->“通用属性”->“框架和引用”->”添加引用”,将显示“添加引用”对话框。 “项目”选项卡列出了当前解决方案中的各个项目以及可以引用的所有库。 在“项目”选项卡中,选择要使用的静态库。 单击“确定”。
    在这里插入图片描述

  • 添加.h 头文件目录,必须修改包含目录路径。打开工程“属性面板”->”配置属性”-> “C/C++”->” 常规”,在“附加包含目录”属性值中,键入.h 头文件所在目录的路径或浏览至该目录。

clip_image014[4]

编译运行OK。

如果引用的静态库不是在同一解决方案下的子工程,而是使用第三方提供的静态库lib和头文件,上面的方法设置不了。还有2中方法设置都可行。

方法二:

打开工程“属性面板”->”配置属性”->“链接器”->”命令行”,输入静态库的完整路径即可。

在这里插入图片描述

方法三:
  • 属性面板”->”配置属性”-> “链接器”->”常规”,附加依赖库目录中输入,静态库所在目录;

  • 属性面板”->”配置属性”-> “链接器”->”输入”,附加依赖库中输入静态库名.lib。

参考

C++静态库与动态库

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值