IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 2021-07-09嵌入式学习---Linux库概念及相关编程 -> 正文阅读

[嵌入式]2021-07-09嵌入式学习---Linux库概念及相关编程

1、分文件编程
一个项目需要实现很多模块功能,如果把这些模块代码都塞进main函数里,会显得程序臃肿,不美观。针对这一现象,可引入分文件编程。
例子:简单算法

//创建.c文件,编写函数代码,suanfa.c
#include <stdio.h>

int jiafa(int a, int b)
{
        return a+b;
}

int jianfa(int a, int b)
{
        return a-b;
}

int chengfa(int a, int b)
{
        return a*b;
}

float div1(int a, int b)
{
        return (float)a/b;
}
//创建.h文件,用于声明函数,suanfa.h
int jiafa(int a, int b);
int jianfa(int a, int b);
int chengfa(int a, int b);
float div1(int a, int b);
//在main函数中,添加引用,demo1.c
#include <stdio.h>
#include <stdlib.h>
#include "suanfa.h"

int main()
{
        int a;
        int b;

        printf("input your first nu:\n");
        scanf("%d", &a);
        printf("input your second nu\n");
        scanf("%d", &b);

        printf("xiangjiawei:%d\n", jiafa(a, b));
        printf("xiangjianwei:%d\n", jianfa(a, b));
        printf("xiangchengwei:%d\n", chengfa(a, b));
        printf("xiangchuwei:%f\n", div1(a, b));
        return 0;
}
运行结果
ltk@ubuntu:~/07.09$ gcc demo1.c suanfa.c 
ltk@ubuntu:~/07.09$ ./a.out 
input your first nu:
1
input your second nu:
3
xiangjiawei:4
xiangjianwei:-2
xiangchengwei:3
xiangchuwei:0.333333

2、Linux共享库、静态库、动态库
一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级。
程序函数库可分为3种类型:静态函数库(static libraries)、共享函数库(shared libraries)、动态加载函数库(dynamically loaded libraries):
静态函数库是在程序执行前就加入到目标程序中去了 ;
优点:
1.静态库被打包到应用程序中加载速度快
2.发布程序无需提供静态库,因为已经在app中,移植方便
缺点:
1.链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。
2.更新、部署、发布麻烦。
在这里插入图片描述
动态函数库同共享函数库是一个东西
在程序执行时(临时)由目标程序去调用
优点:
1.链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序可以共用,节省内存。
2.程序升级简单,因为app里面没有库的源代码,升级之后只要库的名字不变,函数名以及参数不变,只是实现做了优化,就能加载成功。
缺点:
加载速度比静态库慢
发布程序需要提供依赖的动态库
在这里插入图片描述

(在linux上叫共享对象库, 文件后缀是.so ,windows上叫动态加载函数库, 文件后缀是.dll)
Linux中命名系统中共享库的规则:
在这里插入图片描述
静态库的制作
1.将suanfa.c文件生成.o,gcc suanfa.c -c 生成了suanfa.o文件
2.将.o 打包
ar rcs 静态库的名字 原材料
ar rcs libsuanfa.a suanfa.o 生成了libsuanfa.a静态库文件
库的使用
gcc demo1.c -Isuanfa -L ./ -o mainProStatic
-l(小写):指定库的名字(去掉lib和.a)
-L(大写): 指定库的路径,默认是从/usr/lib 或者/usr/local/lib
-o:指定生成的最终应用程序的名字
mainProStatic 生成的程序文件

ltk@ubuntu:~/07.09$ ls
demo1.c  suanfa.c  suanfa.h
ltk@ubuntu:~/07.09$ gcc suanfa.c -c
ltk@ubuntu:~/07.09$ ls
demo1.c  suanfa.c  suanfa.h  suanfa.o
ltk@ubuntu:~/07.09$ ar rcs libsuanfa.a suanfa.o
ltk@ubuntu:~/07.09$ ls
demo1.c  libsuanfa.a  suanfa.c  suanfa.h  suanfa.o
ltk@ubuntu:~/07.09$ gcc demo1.c -lsuanfa -L ./ -o mainProStatic
ltk@ubuntu:~/07.09$ ls
demo1.c  libsuanfa.a  mainProStatic  suanfa.c  suanfa.h  suanfa.o
ltk@ubuntu:~/07.09$ ./mainProStatic 
input your first nu:
1
input your second nu
4
xiangjiawei:5
xiangjianwei:-3
xiangchengwei:4
xiangchuwei:0.250000

动态库的制作

(1)命名规则
动态库的命名方式与静态库类似,前缀相同,为“lib”,后缀变为“.so”。所以为“libname.so”
(2)制作步骤
gcc -shared -fpic suanfa.c -o libsuanfa.so
shared 指定生成动态库
fpic 选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码

把制作好的库放到目录lib中,不放也行,其实只要有这个库就行,在这里,移到上层目录中的lib中

动态库的使用
gcc demo1.c -Isuanfa -L ./ -o mainProDy
此时会提示No such file or directory,需要进行环境变量的设置
动态库无法加载,是因为路径默认是/usr/lib寻找动态库,
LINUX动态库(.SO)搜索路径(目录)设置方法
方法一:在配置文件/etc/ld.so.conf中指定动态库搜索路径。
vi /etc/ld.so.conf
添加 lib目录
ldconfig
方法二(常用):通过环境变量LD_LIBRARY_PATH指定动态库搜索路径。
export LD_LIBRARY_PATH=”/home/ltk/07.09”
”/home/ltk/07.09” 为动态库路径
但是这是临时的,针对一个固定的窗口编译,可以编写一个脚本文件start.sh

export LD_LIBRARY_PATH="/home/ltk/07.09" 
./mainProDy

给脚本加可执行权限 chmod +x start.sh
运行./start.sh

ltk@ubuntu:~/07.09$ ls
demo1.c  suanfa.c  suanfa.h
ltk@ubuntu:~/07.09$ gcc -shared -fpic suanfa.c -o libsuanfa.so
ltk@ubuntu:~/07.09$ ls
demo1.c  libsuanfa.so  suanfa.c  suanfa.h
ltk@ubuntu:~/07.09$ gcc demo1.c -lsuanfa -L ./ -o mainProDy
ltk@ubuntu:~/07.09$ ls
demo1.c  libsuanfa.so  mainProDy  suanfa.c  suanfa.h
ltk@ubuntu:~/07.09$ ./mainProDy 
./mainProDy: error while loading shared libraries: libsuanfa.so: cannot open shared object file: No such file or directory

通过环境变量LD_LIBRARY_PATH指定动态库搜索路径。
编写脚本文件start.sh

export LD_LIBRARY_PATH="/home/ltk/07.09" 
./mainProDy
ltk@ubuntu:~/07.09$ vi start.sh 
ltk@ubuntu:~/07.09$ chmod +x start.sh
ltk@ubuntu:~/07.09$ ./start.sh 
input your first nu:
1
input your second nu
2
xiangjiawei:3
xiangjianwei:-1
xiangchengwei:2
xiangchuwei:0.500000

参考资料:https://www.baidu.com/link?url=ekXV3RxdlZFpsUUl4a6JyCcAiAcvpmwgWedoJvlJ3aBsuV4GA2so5Ui1ueJIB34e8o-QUl7kTiuOxyqcwls-_a&wd=&eqid=90892e1f000282c40000000560e7fa19
https://www.cnblogs.com/sunsky303/p/7731911.html

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-10 14:41:08  更:2021-07-10 14:41:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/3 20:51:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码