常用库的移植安装使用

JPEG库的移植
                         解压缩
                            tar  -zxvf  jpegsrc.v9a.tar.gz
                            cd  jpeg-9a/
                         对jpeg源码进行配置 
                            ./configure --host=arm-linux --prefix=/home/gec/jpeglib
                            make
                            make install
                        把虚拟机中的jpeglib目录拷贝到开发板文件系统中的根目录下
                            /jpgelib
                        修改开发板中的配置脚本/etc/profile
                        增加:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/jpeglib/lib(检查后面是否有直接定义)
                        保存退出后重启开发板
                        编译:arm-liunx-gcc show_jpeg.c -o show_jpeg -I /home/gec/include/ -L /home/gec/lib/ -ljpeg 
                                void pos_show(int n,int x,int y,char *name)//显示JPG格式图片,n放大缩小倍数,x和y显示起始位置,name显示JPEG的路径
                                {
                                    FILE *fp;
                                    int fd;
                                    struct fb_var_screeninfo screeninfo;//声明一个与屏幕信息相关的结构体对象
                                    unsigned char *pLineColor;
                                    unsigned int (*pFrameBuffer)[800];
                                    int image_width,image_height;                                    
                                    struct jpeg_decompress_struct dinfo;//声明一个jpeg解压对象                                    
                                    struct jpeg_error_mgr err;//把jpeg的出错信息关联到进程的标准错误设备上,除非你不关心jpeg库的出错信息
                                    dinfo.err=jpeg_std_error(&err);                                    
                                    jpeg_create_decompress(&dinfo);//创建一个jpeg解压对象

                                    fp=fopen(name,"r");
                                    if(fp==NULL)
                                    {
                                        perror("Cannot open jpeg_file:");
                                        goto exit;
                                    }
                                    jpeg_stdio_src(&dinfo,fp);//将jpeg解压对象和jpeg文件流关联起来,意味这jpeg解压对象将从文件流中获取数据
                                    jpeg_read_header(&dinfo,TRUE);//获取头部信息
                                    image_height=dinfo.image_height;
                                    image_width=dinfo.image_width;
                                    fd=open("/dev/fb0",O_RDWR);//打开framebuffer
                                    pFrameBuffer=(unsigned int (*)[800])mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
                                    dinfo.scale_num = 1;
                                    dinfo.scale_denom = n;
                                    jpeg_start_decompress(&dinfo);//开始解压
                                    pLineColor=(unsigned char*)malloc(image_width*dinfo.num_components);//申请一个保存jpeg一行颜色数据的缓冲区
                                    while(dinfo.output_scanline<dinfo.output_height &&
                                    dinfo.output_scanline<480)                                //按行读取jpeg图片的数据并处理
                                    {
                                        int col;
                                        unsigned char *pTmpColor=pLineColor;
                                        unsigned char red,green,blue;
                                        jpeg_read_scanlines(&dinfo,&pLineColor,1); //读取一行
                                        for(col=0;col<dinfo.output_width&&col<800;col++)//处理一行
                                        {
                                            red=*pTmpColor;
                                            green=*(pTmpColor+1);
                                            blue=*(pTmpColor+2);
                                            pTmpColor+=3;
                                            pFrameBuffer[dinfo.output_scanline-1+y][col+x]=(red<<16)|(green<<8)|blue;
                                        }
                                    }
                                    jpeg_finish_decompress(&dinfo);
                                    munmap(pFrameBuffer,800*480*4);
                                    free(pLineColor);
                                    fclose(fp);
                                    close(fd);
                                exit:
                                    jpeg_destroy_decompress(&dinfo);
                            }
                    SQLITE3库移植
                        解压缩
                            tar  -zxvf sqlite-autoconf-3250200.tar.gz
                            cd  sqlite-autoconf-3250200/
                        对SQLITE3库进行配置
                            ./configure  --prefix=/home/gec/armsqlite  --host=arm-linux
                            make
                            make install
                    使用sqlite3的命令行
                           (1)创建数据文件(要求.db结尾)
                                sqlite3  数据库文件的名字
                                例如:  sqlite3  xxxx.db              
                                .tables    //查看当前数据库文件中有多少个表格              
                                .quit      //退出sqlite3            
                                .help     //查看命令              
                                .dump   //查看历史输入命令
                           (2)创建表格
                                create table 表的名字 (字段1 修饰符号,字段2 修饰符号,........);
                                例如:create table stutable (name text,age int,score float);
                                     创建好的表格自动存储在了.db数据文件中
                           (3)往表格中插入数据
                                insert into 表的名字 values(字段信息一一对应);
                                例如:insert into stutable values("wangwu",19,78);  //重点values很容易漏掉
                           (4)删除表格中的数据
                                delete from 表名字 where 条件;
                                例如:delete from stutable where name="lisi";  //判断字符串相等,直接用=
                           (5)删除整个表格
                                drop table 表的名字
                                例如:drop table stutable;                             
                           (6)查询表格中的数据内容(重点)
                                select * from 表的名字;   //查询所有的信息
                                例如:select * from stutable;
                                select name from 表的名字;  //查询name这个具体字段
                                例如:select name from stutable;
                                select * from 表的名字 where 条件; //按照where语句后面的条件去查询
                                例如:select * from stutable where score<60;  
                                     select * from stutable where score>=60 and score<=80;
                           (7)修改表格中的数据
                                update  表名字 set 新的字段信息 where 旧的字段信息;
                                例如:update stutable set score=88 where score=60.5;
                           (8)常用的修饰语句
                                字段唯一性(比如:电话,身份证号码这些是不可能有重复的)
                                     unique关键词修饰:
                                              例如:  create table stutable (name text,age int,phonenum char[11] unique);
                                     null:表示空值                              
                                              insert into stutable values("zhao",null,null);
                                              空值如何修改删除
                                              delete from sptable where price is null; //不要写成price=null
                                     not null:限制字段不允许接收空值                              
                                     like:模糊匹配字符串                              
                                              select * from stutable where name like "%jian%";  //名字中有jian
                                              select * from stutable where name like "zhang%";  
                                              select * from stutable where name like "%guo";  
                                     order by:升序/降序查询                              
                                               select * from stutable order by age asc;  //按照年龄升序
                                               select * from stutable order by age desc;  //按照年龄降序
                                     if not exists:新建表格的是判断是否存在                              
                                              create table if not exists stutable(name text,age int,phonenum char[11] unique);
                           注意的问题:
                                 第一个:sqlite3并不帮助你检查数据类型
                                          insert into stutable values(852,"kkk","hfdhsfjk");
                                 第二个:字段个数必须一致
                                          insert into stutable values("zhao",15,125879,78.9);
                                                 Error: table stutable has 3 columns but 4 values were supplied
                                 第三个:区分.开头的命令和增删改查命令
                                          .开头的命令后面没有分号
                                          .开头的命令只能小写,但是增删改查命令大小写都行
                                 第四个:同一个数据库文件中不允许出现同名的表格,哪怕表格中的字段不一样,也不行!!!!
                                 第五个:命令输入错误,如何退出,直接输入分号,回车就可以了

                    代码实现数据库操作--->使用sqlite3源码中提供的接口函数(很重要)
                           (1)打开/新建数据库文件 //头文件sqlite3.h的第3338行
                                int sqlite3_open(const char *filename,sqlite3 **ppDb);
                                        返回值:成功 返回SQLITE_OK   失败 参见头文件中的宏定义   //有点类似于errno
                                        参数:filename -->你要打开的那个数据库文件的路径
                                             ppDb -->存放数据库文件的句柄
                           (2)操作数据库文件,调用前面学习的命令 //重点
                                int sqlite3_exec(sqlite3*,char *sql,int (*callback)(void*,int,char**,char**),void *,char **errmsg);
                                        返回值:成功 返回SQLITE_OK   失败 参见头文件中的宏定义
                                        参数:sqlite3* -->将sqlite3_open中的句柄传递过来
                                             sql -->你想要执行的语句
                                             int (*callback)(void*,int,char**,char**) -->函数指针,当你使用查询命令的时候,就必须要用到该参数
                                                        参数: void* -->接收第四个参数传递过来的内容
                                                              int -->你查询的表格的列数
                                                              char** -->具体的每一行的信息
                                                              char** -->字段名 
                                                   重点重点:  查询有结果,callback指向的函数就会被调用,没有结果就不调用
                                                              查询结果有几条,那么callback指向的函数就被调用几次  
                                             void * -->传递给callback的第一个参数
                                             errmsg-->存放出错信息
                           (3)关闭数据库文件
                                int sqlite3_close(sqlite3*);                                                    
                            
                    ALSA库移植
                        解压缩
                            tar  -zxvf alsa-lib-1.0.22.tar.bz2
                            cd     alsa-lib-1.0.22/
                            tar  -zxvf alsa-utils-1.0.22.tar.bz2
                            cd     alsa-utils-1.0.22/
                        交叉编译alsa-lib
                            ./configure --prefix=/home/gec/myalsa \  (此处是alsa库的安装路径,是要按照实际情况来改的)
                                        --host=arm-none-linux-gnueabi \
                                        --disable-python
                            make
                            make install
                        交叉编译alsa-utils
                            ./configure --prefix=/home/gec/myalsa \
                                        --host=arm-none-linux-gnueabi \
                                        --with-alsa-prefix=/home/gec/myalsa/lib/ \
                                        --with-alsa-inc-prefix=/home/gec/myalsa/include/ \
                                        --disable-alsamixer \
                                        --disable-xmlto   
                            make              会出现这个error:找不到alsa-utils-1.0.22/alsaconf/po下面的t-ja.gmo,只需要先创建文件t-ja.gmo,然后make,又出现找不到alsa-utils-1.0.22/alsaconf/po下面的t-ru.gmo,接着新建一个就行了 
                            make install
                            ALSA库的使用
                                第一步:将移植得到的库文件,头文件,可执行程序打包下载到开发板中
                                          配置动态库的环境变量或者偷懒直接将库文件拷贝到开发板的/lib
                                          export LD_LIBRARY_PATH=/XXXX/XXXXX:$LD_LIBRARY_PATH
                                          将bin文件中的arecord和aplay拷贝到开发板的/bin
                               第二步:设置alsa的配置文件路径
                                      将移植得到的文件夹(bin include lib share)share中的alsa文件夹里面的所有文件复制到开发板的/home/gec/myalsa中
                                      注意,注意,注意:解压之后的文件夹在开发板中路径也必须跟当初你移植的时候ubuntu上的路径一致  
                               第三步:设置音频文件相关设备节点
                                      执行写好的脚本   ./mknod.sh(开发板中打开这个脚本,将每一行后面的M去掉)
                               第四步:录音和播放
                                      arecord -d3 -c1 -r16000 -twav -fS16_LE example.wav
                                          说明:
                                             -d:录音时长(duration)  秒
                                             -c:音轨(channels)
                                             -r:采样频率(rate)   人的耳朵 20HZ ---20000HZ
                                             -t:封装格式(type)     
                                             -f:量化位数(format)16bit  小端
                              第五步:播放
                                      执行如下命令播放
                                      aplay example.wav
                               在做的过程中遇到的问题:
                                   第一个问题: write error: No space left on device 
                                   解决方案:  第一步  mkfs.vfat  /dev/mmcblk0p7       将/dev/mmcblk0p7格式化
                                              第二步  mount -t vfat /dev/mmcblk0p7   /xxxx     将/dev/mmcblk0p7挂载到开发板/xxxx下面
                                              第三步  以后你下载的大文件就存放到/xxxx就可以了(/xxxx就相当于是新开辟空间)

猜你喜欢

转载自blog.csdn.net/lly_3485390095/article/details/83022038