嵌入式Linux编程OrangePi开发 静态函数库和动态函数库的生成和使用

硬件基础:全志H616(Cortex-A53)

软件平台:MobaXterm

一、OrangePi刷机:

1、准备读卡器、SD卡,先将SD卡格式化,用到的软件工具:SD Card Formatter,

2、安装刷机软件 win32diskimager-1.0.0-install.exe 安装后,将SD卡插入电脑,打开Win32软件

 找到Orangepi镜像文件路径,写入,将镜像文件写入到SD卡中。刷机完成后,弹出SD卡,把SD卡正面朝上 插入到全志开发板中。

二、OrangePi登录方式:

1、串口方式登录:

     USB TO TTL 串口 连接 全志开发板上串口(TXD -- RXD 连接) 插入电脑,插上电源线给开发板上电。

2、SSH方式登录:

在终端输入ifconfig 查找 WiFi热点的IP地址,在SSH登录端输入IP地址 登录即可。

三、Linux库的引入 及 分文件编程:

(一)、分文件编程的意义:

a、分模块化编程思想

b、功能责任划分

c、方便调试(查到哪里出问题,就解决哪里) 

d、主程序简洁 

 

例:

1-1、 网络模块

1-2、超声波模块

1-3、电机 模块

1-4、蓝牙模块

(二)、Linux库的引入:

借图:

在这里插入图片描述

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

a)、静态函数库:

优点:

          1、在程序执行前(编译)就加入到目标程序中去了,加载运行速度快

          2、 发布程序的时候无需提供静态库,因为已经在app中,移植方便

缺点:

          1、链接时完整的拷贝到可执行文件中,被多次使用就会有多份冗余拷贝,体积大

          2、 更新库,部署,发布麻烦 

b)、动态函数库:

            是在目标程序执行时动态(临时)由目标程序去调用

优点:
1)链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序可以共用,节省内存
2)程序升级简单,因为app中没有库的源代码,升级之后只要库的名字不变,函数名与及参数不变,只是做了优化,就能加载成功

缺点:
1)加载速度比静态库慢
2)发布程序时需要提供依赖的动态库

(三)、库的生成和使用

1、静态库

(1)静态库的生成:

     静态库 在程序执行前(编译时)就要加载到目标程序中去,那应该怎样制作和使用?

第一步:终端输入 gcc func.c  -c  生成 func.o文件 

  

第二步:ar rcs libfunc.a func.o // 用 func.o文件 生成  libfunc.a 静态库文件

(2) 静态库的使用:

 第三步:       编译 :gcc main.c -lfunc -L ./  -o Func

-lfunc : -l 是调用静态库,库名砍头去尾(如:库名是 libfunc.a,去掉 lib和.a)
-L 告诉gcc编译器 从-L指定的路径去找静态库。默认是从/usr/lib  或从  /usr/local/lib 去找


第四步:      运行: ./Func   

 

是一种可执行二进制的文件形式, 别人可以使用库,但是看不到库中的内容。

2、动态库

(1)动态库的生成

      动态库,是在程序执行时由目标程序(动态、临时)去调用它的
输入: gcc -shared -fpic func.c -o libfunc.so   , 用func.c文件 生成 libfunc.so文件

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

(2) 动态库的使用

动态库的使用其实和静态库是一样的语法,但区别在于怎么引用动态库,怎么指定动态库的位置:

 我们输入正确的指令:

              编译: gcc main.c -lfunc -L ./ -o Func  生成可执行文件Func

              执行: ./Func

结果出错:

 找不到指定位置的动态库。

指定动态库位置:

     一般来说有三种解决方法:

方法1:用 sudo  cp libFunc.so  /usr/lib/  , 将libFunc.so 库文件 拷贝到  /usr/lib/ 文件目录路径下, 运行 


 

通常用的是方法2,以下介绍:
        与Windows里面的环境变量一样,在Linux系统下 是命令的方法显示,输入export 命令,会显示所有的环境变量

方法2:带动态库的程序,可以在该程序运行时,通过环境变量LD_LIBRARY_PATH 搜索路径指定动态库,找到库文件    export LD_LIBRARY_PATH="/home/orangepi/test" 

 

 这样就将工作目录地址(路径)添加到环境变量中,就能正常执行了。

但这只是限制在当前会话窗口,换一个窗口,又找不到了。

此时,就需要编写一个脚本文件xxx.sh 

输入: chmod +x Func.sh  ,赋予 Func.sh 脚本文件 可以执行的权限

 

执行结果:

 

方法3:在编译目标代码时指定该程序的动态库搜索路径。
还可以在编译目标代码时指定程序的动态库搜索路径。通过gcc 的参数”-Wl,-rpath,”指定

补充:
两个动态库函数 重名问题:
应用程序fun(fun.c),动态库libfun.so(libfun.h, libfun.c),libmun.so,均可实现fun()函数功能

(1)、执行 gcc -lfun -lmun fun.c, 则调用的是libfun.so中fun()函数实现

(2)、执行 gcc -lmun -lfun fun.c ,   则调用的是libmun.so中fun()函数实现

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值