参考:linux静态库与动态库编程
作者:丶PURSUING
发布时间:2021-02-02 16:51:49
网址:https://blog.csdn.net/weixin_44742824/article/details/113539449?spm=1001.2014.3001.5501

目录

  • 一、分文件编程的引入
    • 优点
    • 实现
  • 二、库的概念
    • 什么是库
    • 静态库动态库优缺点
  • 三、库的编程
    • 静态库
      • 制作
      • 使用
    • 动态库(常用)
      • 制作
      • 使用(运行时链库需添加环境变量)
  • 四、其他
    • 1.secureCRT支持中文编码
    • 2. du指令计算文件大小

一、分文件编程的引入

简单来说就是模块化编程

优点

  • 分工明确
  • 方便调试
  • 主程序简洁

实现

EG:用分文件编程的形式写一个简单的加法程序

  1. 编写主程序: mainFunc.c
#include <stdio.h>
#include "addFunc.h"int main()
{int num1;int num2;int ret;printf("请输入第一个加数\n");scanf("%d",&num1);printf("请输入第二个加数\n");scanf("%d",&num2);ret=funcAdd(num1,num2);printf("结果:%d\n",ret);return 0;
}

< > 直接去默认路径 /usr/include 寻找头文件,找不到直接报错。多用于系统头文件
" " 先在当前路径寻找,没有则去默认路径。用于自己创建的头文件。

ls /usr/include |grep stdio 筛选

  1. 编写功能程序: addFunc.c
int funcAdd(int num1,int num2)
{int ret;ret=num1 + num2;return ret;
}
  1. 新建功能程序的头文件,对其函数进行声明:
int funcAdd(int num1,int num2);
  1. 编译
gcc mainFunc.c addFunc.c
  1. 运行
./a.out

顺序总结:声明(.h文件)-> 定义(.c文件)-> 使用(main函数)

二、库的概念

什么是库

库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。就是将源代码转化为二进制格式的源代码,相当于进行了加密,别人可以使用库,但是看不到库中的内容。

静态库:在程序执行之前(编译)就加入到目标程序中
动态库:是在程序执行时动态(临时)由目标程序去调用。动态库与共享库是同一个东西(linux上叫共享库,文件后缀.so)(windows上叫动态库,文件后缀.dll)

静态库动态库优缺点

参考博文

静态库优点
①静态库被打包到应用程序中加载速度快
②发布程序无需提供静态库,因为已经在app中,移植方便
静态库缺点:
①链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。
②更新、部署、发布麻烦。

动态库优点:
①链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。
②程序升级简单,因为app里面没有库的源代码,升级之后只要库的名字不变,函数名以及参数不变,只是实现做了优化,就能加载成功。
动态库缺点:
①加载速度慢于静态库。
②发布程序需要提供依赖的动态库。

三、库的编程

EG:把加法功能的程序分别制作成静态库、动态库,然后使用库

源代码如上文所示,现有主程序 mainFunc.c与功能程序 addFunc.c

静态库

制作

交付文件为 .a与带注释的 .h

  1. 生成.o文件
gcc addFunc.c -c
  1. 生成.a文件
ar rcs libaddFunc.a addFunc.o

rcs为传入的参数,输入ar后回车可查看具体参数的意义

使用

  1. 编译
gcc mainFunc.c -laddFunc -L ./ -o mainStatic

-laddFunc链接库,为libaddFunc.a的砍头去尾
-L 去指定路径(./)寻找静态库。否则默认为到/usr/lib寻找。

  1. 运行
./mainStatic

动态库(常用)

制作

交付文件为 .so与带注释的 .h

  1. 功能程序生成.so文件
gcc -shared -fpic addFunc.c -o libaddc.so

动态库的命名只需要前有lib,后有.so即可

-shared 指定生成动态库
-fpic 标准,fPIC 选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码。

使用(运行时链库需添加环境变量)

  1. 动态库链接主程序进行编译
gcc mainFunc.c -laddc -L ./ -o mainDy

此时还不能直接./mainDy运行,运行时动态调库,会找不到动态库。(程序执行过程由目标程序去寻找调用动态库,默认路径为usr/lib)

  1. 解决办法

①将动态库拷贝到系统库的目录再运行(不建议使用)

sudo cp libaddc.so /usr/lib/

②把当前位置(“动态库的位置”)作为环境变量再运行

export LD_LIBRARY_PATH=""  //pwd命令将当前路径放入引号里面

之前还学习过myCp指令全局可用

但是这样的环境变量仅是临时的,只针对于这个窗口,换了一个窗口又不行了。

③写一个shell脚本,然后运行该脚本

  1. 创建一个shell脚本
vi start.sh
  1. 写shell脚本代码(脚本本质就是把多个命令集成在一起)
export LD_LIBRARY_PATH=""pwd命令将当前路径放入引号里面
./mainProDy
  1. 给脚本一个可执行权限
chmod +x start.sh
  1. 执行该脚本
./start.sh

四、其他

1.secureCRT支持中文编码

2. du指令计算文件大小

du mainDy//计算动态库文件大小(单位是K)

du xxx -h 当文件较大时可用此指令以M为单位显示文件大小。

linux分文件编程、静态库与动态库相关推荐

  1. 4.树莓派Linux分文件编程、动态库与静态库

    分文件编程 分文件编程案例: 网络 a 超声波 b 电机 c 分文件编程好处: a.功能责任划分 b.方便调试 c.主程序简洁 主程序: 注意:主程序必须包含分程序的 #include "x ...

  2. linux库--静态库、动态库

    文章目录 一.分文件编程思想 二.动态库静态库 1.概念介绍 2.静态库的制作和使用 3.动态库的制作和使用 一.分文件编程思想 好处: 分模块的编程思想 例如: 网络 a 超声波b 电机c a.功能 ...

  3. Linux库概念及分文件编程(面试重点)

    1.分文件编程案例 分文件前的源代码: #include <stdio.h> /** 功能性的函数* 1.串口* 2.网络* 3.线程* 4.语音* 5.加法.乘法.减法.除法* */ i ...

  4. Linux静态库与动态库的相关概念以及编程

    一.分模块编程: 当我们在实现一个项目的时候,比如wifi小车,我们会碰到超声波模块,电机模块,wifi模块等模块的开发,这时候,我们可以让不同的小组成员来完成不同的模块,作为项目负责人只需要调用他们 ...

  5. linux 中如何将文件粘贴到usr下的lib内,学会在Linux下GCC生成和使用静态库和动态库...

    一.基本概念1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同(主 ...

  6. 【C语言】标准库(头文件、静态库、动态库),windows与Linux平台下的常用C语言标准库

    一.Introduction 1.1 C语言标准库 1.2 历代C语言标准 1.3 主流C语言编译器 二.C语言标准库 2.1 常用标准头文件 2.2 常用标准静态库 三.windows平台 四.Li ...

  7. linux静态库添加文件,Linux静态库和动态库的编写和使用

    Linux静态库和动态库的编写和使用 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 1  静态库和动态库的区别 1.1. 静态函数库 (1)静态函数库的名 ...

  8. C/C++库文件全了解(包含静态库、动态库,包含windows、linux,包含dll、lib、so)

    目录 C/C++库文件全了解 一. 前言 二. 名词解释 2.1. windows的静态库:xxx.lib 2.2. windows的动态库:xxx.dll 2.3. linux的动态库:libxxx ...

  9. Linux系统上库文件的生成与使用(静态库和动态库)

    目录 1.什么是库文件? 2.静态库的生成与使用 2.1.生成 .o 文件 2.2.创建静态库 2.3.使用静态库 3.动态(共享)库的生成与使用 3.1.生成 .o 文件 3.2.生成动态库文件 3 ...

最新文章

  1. xml file too big to import to wordpress website
  2. POJ 1190 生日蛋糕 【DFS + 极限剪枝】
  3. UIProgressView的使用
  4. syslinux引导GRUB4DOS
  5. python数值运算答案_笨方法学Python 习题3:数字和数学计算
  6. SQL 脚本中的全角逗号引起【ORA-01756: 引号内的字符串没有正确结束】
  7. 深圳乐易网络有限公司机试题String to Integer (atoi)
  8. NB-IoTDTU对比于3G/4G DTU的区别和优势
  9. 【转】SASS用法指南
  10. LeetCode 2166. 设计位集(Bitset)
  11. 跟我学算法-集成算法
  12. 2011考研数学二第(19)题——拉格朗日中值定理证不等式、单调有界证数列收敛、两问关联
  13. java yml文件_Yml文件的写入和读取
  14. python期货基本面分析_期货盘面分析语言,我用python做期货
  15. kk5.0服务器信息怎么填,蓝凌KK5.0:企业大连接的IT落地支撑平台
  16. support转androidx关系映射
  17. 王者荣耀s16服务器维护,王者荣耀:S16单排环境依旧差劲 五大原因戳到很多人的痛点...
  18. 企业微信异常java.security.InvalidKeyException:illegal Key Size的解决方案,提供jce_policy-8下载
  19. java中以yyyyMMddHHmmss格式取得系统时间
  20. 带你快速通过字节跳动面试,看看这篇文章吧!

热门文章

  1. tomcat启动报:No Spring WebApplicationInitializer types detected on classpath
  2. log4j日志文件配置说明及使用
  3. linux:将job放在后台执行的方法
  4. spring-在配置文件中配置DAO时直接引用DataSource
  5. Linux出现NOKEY
  6. MFC控件(7):Split Button
  7. C# : 调用C++动态库(dll)
  8. 麦克风设计指导与选型参考
  9. HALCON示例程序count_pellets.hdev分割豆子,基本形态学的使用
  10. ANSYS——常见梁的后处理方法(弯曲应力、弯矩、轴力等的显示)