一.分模块编程:
当我们在实现一个项目的时候,比如wifi小车,我们会碰到超声波模块,电机模块,wifi模块等模块的开发,这时候,我们可以让不同的小组成员来完成不同的模块,作为项目负责人只需要调用他们的模块函数即可。
所以分模块编程有以下优点:
a.功能责任划分
b.方便调试
c.主程序简洁

二.静态库与动态库
1.介绍
使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级。

程序函数库可分为3种类型:静态函数库(static libraries)、共享函数库(shared libraries)、动态加载函数库(dynamically loaded libraries)
动态函数库同共享函数库是一个东西(在linux上叫共享对象库, 文件后缀是.so ,windows上叫动态加载函数库, 文件后缀是.dll)
2.区别
a) 静态库
静态函数库,是在程序执行前(编译)就加入到目标程序中去了 ;
优点: 运行快
发布程序无需提供静态库,因为已经在app中,移植方便
缺点:大
b) 动态库
动态函数库,是在程序执行时动态(临时)由目标程序去调用
缺点: 运行慢
优点: 小

三.库的制作
先来看一下整体的代码,这是一个计算器:

#include<stdio.h>int add(int a,int b)
{int c;
c=a+b;
return c;
}int sub(int a,int b)
{int c;
c=a-b;
return c;
}int mul(int a,int b)
{int c;
c=a*b;
return c;
}float div(int a,int b)
{float c;
c=(float)(a/b);
}int main()
{int x;
int y;
printf("input NO.1 data\n");
scanf("%d",&x);
printf("input NO.2 data\n");
scanf("%d",&y);
printf("add:%d+%d=%d\n",x,y,add(x,y));
printf("sub:%d-%d=%d\n",x,y,sub(x,y));
printf("mul:%dx%d=%d\n",x,y,mul(x,y));
printf("div:%d/%d=%f\n",x,y,div(x,y));
return 0;
}

来看一下运行结果:
我们把函数调用和主函数分开来试试(把函数调用封装成库)
静态库:
主函数

#include<stdio.h>
#include"func.c"
int main()
{int x;
int y;
printf("input NO.1 data\n");
scanf("%d",&x);
printf("input NO.2 data\n");
scanf("%d",&y);
printf("add:%d+%d=%d\n",x,y,add(x,y));
printf("sub:%d-%d=%d\n",x,y,sub(x,y));
printf("mul:%dx%d=%d\n",x,y,mul(x,y));
printf("div:%d/%d=%f\n",x,y,div(x,y));
return 0;
}
~

函数:

int add(int a,int b)
{int c;
c=a+b;
return c;
}int sub(int a,int b)
{int c;
c=a-b;
return c;
}int mul(int a,int b)
{int c;
c=a*b;
return c;
}float div(int a,int b)
{float c;
c=(float)(a/b);
}

头文件:

int add(int a,int b);
int sub(int a,int b);
int mul(int a,int b);
float div(int a,int b);

怎么把他们编译到一起呢
经过一系列操作我们会得到以下文件:
calculator.c 原程序
func.c 被调用的函数
func.h 头文件
mainStatic.c 主函数
我们要做的是把2.3.4给串联起来,首先主函数包含头文件
#include"func.h"
接下来是对func函数进行两步操作
a. gcc xxx.c -c 生成xxx.o文件
b. ar rcs libxxx.a xxx.o xxx.o文件生成xxx.a静态库文件
示例:

gcc func.c -c//生成func.o
ar rcs libfunc.a func.o //libfunc.a是生成的库,func.o是材料

接下来我们编译主函数,让主函数链库

gcc mainStatic.c -lfunc -L ./ -o main
//-lxxx就是连接哪个库,比如-lcurses就是调用ncurse图形库,-L./就是在当前路径下寻找库,不然会去/usr/lib里面找

编译完后我们会得到mian这个可执行文件,然后我们试一下,程序执行起来和原程序一样

动态库的制作:
首先我们做出func.so这个库

gcc -shared -fpic func.c -o func.so

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

然后我们编译主函数:

 gcc mainDy.c -lfunc -L ./ -o mainDy//mainDy.c就是主函数, 同样-lxxx链接库,然后在当前路径下连接,最后一个-o改一下名字

结果:

这里需要注意,一般来说这么写会报错,找不到库,因为系统默认是去/user/lib/里面去找的,由于该版本ubantu会自动帮我们去找到这个动态库所以没报错,但是在树莓派运行的linux上就会有报错,所以我们有什么解决办法呢
一般我们有这两种方法:
1.用超级用户权限(sudo)把编译好的.so库cp到/user/lib下面去(不建议)
2.更改环境变量:可以指定该程序运行时候,在LD_LIBRARY_PATH 所指定的路径去找库文件
export LD_LIBRARY_PATH="/xxx/xxx"
争对第二种方法,其实我们可以写一个脚本,即更改环境变量后再运行main函数的脚本:

export LD_LIBRARY_PATH="/home/CLC/Project3"
./mainDy

我们再用chmod +x给脚本文件加一个可执行权限,结果如下:
以上就是关于Linux静态库与动态库的相关概念以及编程,尚有不足之处,请各位大神指正。
salute CLC

Linux静态库与动态库的相关概念以及编程相关推荐

  1. 关于Linux静态库和动态库的分析

    From: http://hi.baidu.com/bdccutysj/blog/item/5bae7f0202abac7c3912bb15.html 1.什么是库 在windows平台和linux平 ...

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

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

  3. Linux中gcc的编译、静态库和动态库的制作

    欢迎大家关注笔者,你的关注是我持续更博的最大动力 Linux中gcc的编译.静态库.动态库 文章目录: 1 gcc的编译过程 1.1 gcc的编译过程 1.2 gcc的常用参数 2 gcc 静态库的制 ...

  4. Linux下的静态库、动态库和动态加载库

    from: http://www.techug.com/linux-static-lib-dynamic-lib 库的存在极大的提高了C/C++程序的复用性,但是库对于初学者来说有些难以驾驭,本文从L ...

  5. linux下的共享库(动态库)和静态库

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

  6. Linux基础——gcc编译、静态库与动态库(共享库)

    Linux基础--gcc编译.静态库与动态库(共享库) https://blog.csdn.net/daidaihema/article/details/80902012 Linux基础--gcc编译 ...

  7. Linux下制作和使用静态库和动态库

    写在前面: ldd + 可执行文件 可以查看可执行文件所依赖的库 概述: Linux操作系统支持的函数库分为静态库和动态库,动态库又称共享库.linux系统有几个重要的目录存放相应的函数库,如/lib ...

  8. Linux 之三 静态库及动态库的编写和使用

      最近在整理旧电脑时,发现了一些刚入行时的学习记录,以及最早使用新浪博客 http://blog.sina.com.cn/zcshou 写的一些文章.最近要重拾 Linux,所以把这些 Word 文 ...

  9. Linux学习:静态库和动态库

    1.库是什么? 将"源代码"变为"二进制格式的源代码"(作用:加密,别人可以用,但不知道其中的内容). 2.库制作出来之后,如何给用户使用? 需要给用户:头文件 ...

最新文章

  1. php 表单变量,PHP学习笔记——访问表单变量
  2. React-状态提升
  3. 多线程大文件断点续传和流媒体的处理方法
  4. webservice的css哪里添加,jQuery_XML+XSLT+CSS+JQuery+WebService组建Asp.Net网(2), 3.       更 - phpStudy...
  5. HTML基础 DOM概览(第一天)
  6. Bootstrap3.0 栅格系统背后的精妙魔法(Bootstrap3.0的栅格布局系统实现原理) - willian12345...
  7. kb2999226此更新不适用你的计算机,Windows Server 2012 R2 安装补丁KB2999226提示此更新不适合用于计算机...
  8. Android编程怎么打开,安卓手机如何开启开发者模式?简单三步骤教你解决!
  9. win10如何一键还原系统
  10. 最短曼哈顿距离(递推+枚举 C++)
  11. 4.46-47访问控制4/5
  12. 华为面试题(小朋友高矮排序,要求移动距离最小)-java版
  13. java基础知识精华总结集合
  14. Windows安装程序初始化时出错。安装程序将立即关闭。(原)
  15. c语言graphics调用gpg图片,求助:嵌入式c驱动程序,初始化gpg0和gpg9 为什么getpin时不是0...
  16. 如何屏蔽QQ弹出的腾讯网弹窗?技巧经验!怎样将QQ登录弹出的腾讯网弹窗关闭?
  17. rke部署k8s_v1.20.15高可用
  18. 计算机网络基础知识大汇总
  19. LWN:业余无线电的FOSS软件!
  20. 半导体物理与器件 第五章—载流子输运现象

热门文章

  1. 大学计算机考试基础理论试题,大学计算机基础理论知识前三章测试题
  2. 采用ip限制访问次数
  3. 让你的网页更丝滑(全)
  4. npm下载报错npm ERR! code ETIMEDOUT npm ERR! syscall connect npm ERR! errno ETIMEDOUT npm ERR! network re
  5. ubuntu快捷键 和 自动隐藏任务栏
  6. FineReport学习计划表报错:11300001
  7. 豌豆荚导致adb连接错误
  8. VC6.0的一个编译错误:fatal error C1001: INTERNAL COMPILER ERROR。
  9. 将火星坐标转换成百度坐标
  10. 课件属于计算机应用中的什么,ppt课件-《计算机应用基础》课件.ppt