文章目录

  • 静态库简介
  • 静态库制作
    • 代码实现
    • 创建静态库
  • 链接使用静态库

静态库简介

静态库的本质就是将多个目标文件打包成一个库文件。链接静态库就是将库中被调用代码复制到可执行文件中。使用了静态库的可执行文件占用磁盘空间和内容空间都比较大,静态库中代码被修改后,需重新生成库文件并需重新链接库文件。使用静态库的可执行文件无需依赖静态库,静态库即使被删除,也可照常运行。执行效率比动态库相对要高。

静态库的文件形式为:lib<库名>.a

静态库制作

代码实现

假如我们制定一个数学操作的静态库,在同一个文件夹下,有如下文件:
– add.c
– add.h
– sub.c
– sub.h

add.c为加法操作实现,sub.c为减法操作实现。
代码如下:

add.h

#ifndef C_ADD_H
#define C_ADD_Hint add(int a, int b);#endif //C_ADD_H

add.c

#include "add.h"int add(int a, int b) {return a + b;
}

sub.h

#ifndef C_SUB_H
#define C_SUB_Hint sub(int a, int b);#endif //C_SUB_H

sub.c

#include "sub.h"int sub(int a, int b) {return a - b;
}

创建静态库

首先我们将源代码编译为目标文件:
gcc -c add.c sub.c
执行完毕后会生产add.o和sub.o文件。

静态库创建使用ar命令;
ar -r libmymath.a add.o sub.o
执行完后,会创建一个libmymath.a文件。

链接使用静态库

我们为了使用上面的静态库,我们在如上相同文件夹下,创建一个main.c文件:
– add.c # 加法实现
– add.h # 加法头文件
– sub.c # 减法实现
– sub.h # 减法头文件
– libmymath.a # 静态库文件
– main.c # 入口主程序

main.c

#include <stdio.h>
#include "add.h"
#include "sub.h"int main(void) {int a = 20;int b = 10;printf("%d+%d=%d\n", a, b, add(a, b));printf("%d-%d=%d\n", a, b, sub(a, b));return 0;
}

我们使用#include预处理指令包含了sub.h和add.h头文件,来使用我们制作的mymath静态库。
如果我们直接gcc -o main main.c肯定会出错,因为编译器不知道add.h和sub.h是哪里来的,也不知道add和sub函数的定义在哪里。
所以我们需要使用-l选项,让编译器链接到我们制作的静态库:

gcc main.c libmymath.a -o main

此时在当前目录生成了main的可执行文件。
运行得到如下:

20+10=30
20-10=10

静态库如果被删除,不会影响可执行文件的执行。因为静态库的代码被复制到了可执行文件中,作为了可执行文件的一部分,这也是静态库和动态库的部分区别所在。

至此,从静态库的制作到链接使用就结束了。

C语言 静态库制作(亲测可行)相关推荐

  1. win10双磁盘安装ubuntu16.04双系统 GTX1660Ti+UEFI+GPT 亲测可行

    有独显的笔记本在安装ubuntu系统的时候都会比较折腾,网上教程多且繁杂,每次安装都会遇到不同的问题,很多教程上会经常遇到卡在ubuntu的logo界面不动的情况,我就没有遇到,所以这件事情还是按照自 ...

  2. Windows下命令行及Java+Tesseract-OCR对图像进行(字母+数字+中文)识别,亲测可行

    Windows下Java+Tesseract-OCR对图像进行字符识别,亲测可行 1. 下载tesseract-ocr.中文语言包并安装 2. 命令行对图片进行识别及效果图 3. Java调用Tess ...

  3. [亲测可行]Ubuntu16.04+opencv3.4+opencv_contrib+cuda9.0安装

    这篇博客主要总结下在Ubuntu下安装opencv以及扩展库所遇到的问题,以及解决的方案. Opencv版本:3.4.7+CUDA9.0+1060 一.下载Opencv+contrib 在Opencv ...

  4. C语言程序设计物资信息管理系统,c语言仓库物资管理系统亲测可用.docx

    c语言 仓库物资管理系统 亲测可用 #include #include #include void menu(void);//显示系统主菜单 void kucun(void);//库存记录 void ...

  5. Linux gcc编译过程及动态/静态库制作

    Linux库概念及如何制作静态库和动态库 1: gcc编译的过程 2: 分文件编程 3: 库(静态库和动态库) 3.1: 库的基本介绍 3.2: 静态和动态库的区别 3.3: 库的制作及使用 3.3. ...

  6. bazel 链接第三方动态库_Linux 动态库与静态库制作及使用详解

    Linux 应用开发通常要考虑三个问题,即:1)在 Linux 应用程序开发过程中遇到过标准库链接在不同 Linux 版本下不兼容的问题: 2)在 Linux 静态库的制作过程中发现有别于 Windo ...

  7. vegas pro 15解决导入的视频和音频有噪声问题,亲测可行

    vegas pro 15解决导入的视频和音频有噪声问题,亲测可行 参考文章: (1)vegas pro 15解决导入的视频和音频有噪声问题,亲测可行 (2)https://www.cnblogs.co ...

  8. python程序打包成exe可执行文件,亲测可行(pyinstaller教程)

    python程序打包成exe可执行文件,亲测可行(pyinstaller教程)(11-20190214) 文章目录: 有些程序你不想让别人看到,由此程序你想做成绿色软件普惠大众,有些..., 然而你只 ...

  9. 静态库制作-混编(工程是oc为基础)

    最近工作需要,需要制作一些静态库.由于缺乏经验,特意找了一些资料,加上自己的测试.特意在此记录一些心得和踩过的坑.所谓"好记性不如烂笔头",希望自己以后忘记的时候能回头来看看,同时 ...

最新文章

  1. python_2开发简单爬虫
  2. 计算机控制的点火系统由,第八节(点火系统)
  3. 2021全球权威AI性能竞赛MLPerf最新榜单: 浪潮获18项冠军几近半壁江山
  4. python提取数据库数据_Python如何读取MySQL数据库表数据
  5. websocket的用途/场景
  6. 简明 Vim 练级攻略 (转)
  7. android 输入法sd卡,如何android扫描SD卡列出大文件
  8. Android 壁纸设置代码 详解
  9. python鼠标选中文本内容_【求助】使用Python脚本如何获取Windows中选中的文本
  10. dd 转换和拷贝复制文件
  11. qca9535 tftp32 刷机_【U-Boot】U-Boot 刷机方法大全
  12. mt7620 eeprom 小米_小米CC9 Pro搭载1亿像素传感器,新款手表引关注;谷歌称微信软件性能太差;iPhone明年或配备120Hz屏幕...
  13. python如何压缩pdf_PDF文件怎么压缩,一键压缩PDF文件
  14. Python应用练习题(第一期)——基本语句练习
  15. 一台计算机怎样介绍自己,一台电脑的自我介绍作文
  16. 中科大和华师大计算机,今天就是你最后的机会,2019华师软件工程跨考经验
  17. AutoJs学习-读写手机联系人
  18. 012.二叉树的所有路径
  19. iOS直播app原理
  20. TortoiseGit commands(命令)(完整中文翻译)

热门文章

  1. uniapp 默认的 ‘再按一次退出应用’ 提示语修改方法
  2. python基础——Linux系统下的文件目录结构
  3. easy-ui表单校验---针对单个字段,多重校验(有参数校验+无参数检验)
  4. @Transactional注解事务不回滚不起作用无效
  5. Python __dict__和vars()
  6. 年方二八,人生的路口之上
  7. Ubuntu 16.04系统下配置cocos2dx-3.10
  8. git 提交修改到github上
  9. 织梦wap.php绑定域名,dedecms织梦cms 手机站移动端 绑定设置独立M或wap域名的方法...
  10. 【数据结构与算法】之深入解析“两数之和”的求解思路与算法示例