嵌入式系统作业二
1.我们要继续围绕gcc编译器做一些工作,主要是关于静态库.a文件和动态库.s文件以及他们的使用
要生成这些文件,首先要准备.o文件,先来看看文件目录吧:
生成.o文件:
当然我们可以选择更具体地观察生成.o文件的过程,也就是说
从.i文件变成.s文件再到.o文件:
再用gcc生成可执行文件:
可以用gcc -pedantic或gcc -Wall在编译时检查,因为我的代码没有大问题,所以看不到警告:
objdump命令可以对可执行文件进行反汇编:
readelf命令可以查看段信息:
静态库生成.a文件
链接静态库的基本格式为:
gcc -o main main.o -L./ -ls1 (s1是需要用到的静态库文件libs1.a的写法),示例如下:
也可以写成:
或者只生成一个静态库(也就是说是用单个.o文件生成.a文件再用多个.a文件生成.out文件;或者用多个.o文件生成.a文件再用单个.a文件生成.out文件):
动态库的使用方法几乎完全和静态库一样,只是生成方式略有不同:
我们将静态库和动态库生成的文件分别命名为m1ainl,m2ainl。
先看看在移除其他文件的情况下,这两个程序能否正常运行:
动态库生成的程序出现了问题,将相关依赖移入目录,仍不能正常运行:
实际上我们需要把.so文件放入usr/lib文件夹下,再尝试一遍:
当然我们也可以通过修改/etc/ld.so.conf文件实现目的:
这里需要在尾部添加.so文件路径
先修改:
再运行:
我们可以比较静态库和动态库文件大小以及他们生产的可执行文件大小:
发现动态库明显比静态库更大,但是最后生成的可执行文件大小十分接近。
2.OpenCV相关
mat是Opencv的图像存储容器,可以用mat.rows和mat.cols获得图像的高和宽,用create和zero创建新对象,用clone和copyto复制内容。内部可以分为矩阵头和指向像素的矩阵指针。它里面的数据类型type是像CV_8UC1这样的值(8U为8位无符号数,C1表示只有一个通道)
在opencv中,gcc也有自己的用武之地,这是一个用opencv录像的小程序:
在录像时为了能让用户能自如地操控视频的录制,我们用空格控制录像暂停和继续,用escape键作为停止程序的出口(否则只能ctrl+c强制退出)
我们这样编译它:
这个pkg-config是一个编译工具,cflags表示编译时选项,libs 是 链接选项,opencv表示应该在opencv目录下查找相应文件,lstdc++则是为了编译c++程序额外加上的。
这样其实不是很好,Opencv官方推荐我们用cmake的方式。
首先需要写好CMakeLists.txt文件:
接着就是很简单的“cmake ."以及”make"命令就实现了编译
相反的,打开视频文件也很简单,只需要指定路径就可以,因为是同一个目录下所以只写了文件名:
3.git的简单使用:
创建版本库:
连接仓库:
向本地库中添加索引:
确定提交:
开始上传:
提交成功: