linux分文件编程、静态库与动态库

参考: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为单位显示文件大小。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/266826.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

十万个为什么儿童版_《虹猫蓝兔十万个为什么》上架爱奇艺奇巴布绘本馆

虹猫蓝兔绘本《虹猫蓝兔十万个为什么》上架爱奇艺奇巴布绘本馆全套专区。《虹猫蓝兔海底历险记》在爱奇艺PC端首页推广。红网时刻6月11日讯(记者 胡邦建 )今日&#xff0c;记者从湖南漫联卡通文化传媒有限公司获悉&#xff0c;该公司旗下的虹猫蓝兔绘本《虹猫蓝兔十万个为什么》…

获取${}中的值? 比如说var a=${date },无法取出date中的值

https://zhidao.baidu.com/question/2079297372778181268.html 转载于:https://www.cnblogs.com/DixinFan/p/9221953.html

GNU make manual 翻译( 一百四十九)

继续翻译 5.7.4 The --print-directory Option ------------------------------------If you use several levels of recursive make invocations, the -w or --print-directory option can make the output a lot easier to understand by showing each directory as make sta…

创文html5作品,【《创文故事》纪录短片入围作品展播之七】引路人

剧情简介&#xff1a;他只是一名普普通通的教师&#xff0c;却每天风雨无阻地为学生引导起上学放学的路。而这一切&#xff0c;没有一分钱&#xff0c;也没有一分利。他以身作则&#xff0c;用自己的行动感染了周围的人&#xff1a;从一开始的几个人&#xff0c;发展到现在几百…

树莓派外设开发基础(wiringPi库)

参考&#xff1a;树莓派外设开发基础篇 作者&#xff1a;丶PURSUING 发布时间&#xff1a;2021-02-05 18:20:53 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/113673019?spm1001.2014.3001.5501 目录外设开发综述及wiringPi库是什么如何获取如何使…

html仿百度页面代码_百度优化需要注意的4点

百度优化的技术很多&#xff0c;需要根据行业特点进行开拓和挖掘。还需要有多年的网络营销服务经验&#xff0c;进行网站分析、关键词分析、同行竞争分析&#xff0c;优化开始后监视网站流量数据。所以百度优化需要注意的4点如下&#xff1a;(1)页面优化。页面质量不高&#xf…

网页版计算器

网页版计算器 http://files.cnblogs.com/voidobject/%E7%BD%91%E9%A1%B5%E5%BD%A2%E5%BC%8F%E7%9A%84%E8%AE%A1%E7%AE%97%E5%99%A8.rar转载于:https://www.cnblogs.com/voidobject/archive/2012/10/04/2711642.html

android导航屏幕,发现具有软件导航栏的Android设备的真实屏幕尺寸(以像素为单位)...

我需要能够知道屏幕的确切大小,不包括软件导航栏.我正在使用andengine来制作游戏.我们希望全力支持新的Nexus系列(4,7和10)根据许多人指出的this page,软件导航栏的大小应为48dp.然后使用this优秀stackexchange帖子上的信息我收集了用于计算软件导航栏大小的公式应该是&#xf…

清除浮动小记,兼容Ie6,7

.clearfix { *zoom:1;}.clearfix:after{clear:both; display:block; height:0; visibility:hidden; line-height:0; content:\20;}转载于:https://www.cnblogs.com/chenhuichao/p/9223571.html

antd vue 多个下拉 联动_Antd下拉选择,自动匹配功能的实现

我就废话不多说了&#xff0c;大家还是直接看代码吧~placeholder"客户名称"showSearchoptionFilterProp"children"//自动匹配输入onChange{this.selectChange}>{this.state.selectCustomer}补充知识&#xff1a;antd select如何支持既能输入不存在的选项…

树莓派串口通信

目录相关概念简述半双工与全双工串口通信注重什么串口通信编程常用API初次使用需要配置树莓派和电脑串口之间读、写、交互接线编写程序其他简单了解为什么说linux一切皆文件查找文件是否存在相关概念 简述半双工与全双工 全双工允许通信双方同时互传数据&#xff1b;半双工不…

英文环境下中文输入法的设置

英文环境下使用ibus输入法 centos安装的时候已经选择了中文支持&#xff0c;输入法也已经安装&#xff0c;但在英文环境下面竟然无法使用中文输入法&#xff0c;解决办法记录于此&#xff0c; 1.安装ibus(centos6以后已经默认安装) #yum install ibus&#xff08;已经安装了中文…

html把实线变成虚线,Html5 Canvas 绘制虚线和实线的切换方法

场景应用&#xff1a;1需朋者说上事是础一发一开程和开数的目前间)、最开始默认绘制的都新直能分支调二浏页器朋代说&#xff0c;事刚是实线。var canvas document.getElementById("canvas");var context canvas.getContext("2d");context.strokeStyle …

React引入,运行

1.引入 <script src"https://cdn.bootcss.com/react/15.5.4/react.min.js"></script> <script src"https://cdn.bootcss.com/react/15.5.4/react-dom.min.js"></script> <script src"https://cdn.bootcss.com/babel-stand…

ctr z撤回反向_matplotlib 3D图上的反向Z轴

How would one reverse the order on the z axis of a 3D plot (i.e. negative is up, and positive is down)? The following code produces a cone with the base pointing downward; is there a command (like ax.reverse_zlim3d(True) or something?) that can be used t…

linux与windows间共享文件夹 FileZilla树莓派文件传输

参考&#xff1a;linux与windows间的文件共享 作者&#xff1a;丶PURSUING 发布时间&#xff1a;2021-02-09 11:37:48 网址&#xff1a;https://blog.csdn.net/weixin_44742824/article/details/113767236?spm1001.2014.3001.5502 参考&#xff1a;利用FileZilla实现ubuntu与w…

jquery创建并行对象或者叫合并对象

如果有对象A &#xff0c;B 现在我想要合并成对象C 从C里面可以找到A , B 及其子对象 怎么做&#xff1f; var arr new Array();arr[0] $(this).parents("tr")[0];arr[1] $(this).parents("tr").next()[0];var dom $(arr);$(dom).find("td.title …

html5中三角函数,HTML5(四)html5<canvas路径和三角函数的故事>(中)

canvascanvas{background:#ccc;}window.οnlοadfunction(){var canvas document.getElementById("canvas");var cobj canvas.getContext("2d");cobj.rect(100,100,100,100);cobj.stroke();cobj.clip();cobj.fillRect(0,0,120,120);/*画圆*//*cobj.arc(1…

MATLAB 快速绘制曲线图的形状,粗细,颜色

MATLAB 快速绘制曲线图的形状&#xff0c;粗细&#xff0c;颜色 在写论文的时候&#xff0c;经常要用到Matlab绘制一些曲线&#xff0c;包括曲线的形状、粗细、颜色等&#xff0c;可以通过以下的piot函数实现。 1.通过改变R-G-B 的值改变线条的颜色&#xff1a; 通过改变R-G…

[10] AOP的注解配置

1、关于配置文件首先在因为要使用到扫描功能&#xff0c;所以xml的头文件中除了引入bean和aop之外&#xff0c;还要引入context才行&#xff1a;<?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schem…