硬件基础:全志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()函数实现