网上大部分资料太杂、太多,没有一个整体的统一,以下是本人心得,装载请指明出处,谢谢!
在ARM平台上移植sqlite3数据库
需下载的安装包:
ncurses-5.9.tar.gz,
readline-6.1.tar.gz,
sqlite-autoconf-3080100.tar.gz
zlib-1.2.6.tar.gz
① 首先编译sqlite-autoconf-3080100.tar.gz
tar –zxvf sqlite-autoconf-3080100.tar.gz
cd sqlite-autoconf-3080100
./configure --host=arm-linux --prefix=/media/disk/mikechen/install/sqlite3 --with-shared
make && make install
在/media/disk/mikechen/install/sqlite3/lib目录下只会生成静态库libsqlite3.a,而我需要动态库,所以只能自己编译(注意:由于要编译成动态库时,配置参数--with-shared,不能被识别,所以必须自己编译动态库)
在解压的目录下sqlite-autoconf-3080100中找到sqlite3.c, sqlite.h文件,将这两文件放到新建目录sqlite3,然后在该目录下执行
arm-linux-gcc sqlite3.c -lpthread -ldl -fPIC -shared -o libsqlite3.so
其中:
-lpthread是共享多线程库,数据库是多线程
-fPIC 表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的
-ldl系统库用于支持动态装载
-shared 表示生成一个共享目标文件
这样就生成了交叉动态库libsqlite3.so
测试动态库,新建目录test,建立一test.c文件,并且将上述生成的动态库libsqlite3.so拷贝到该目录下,程序自己写。。。
arm-linux-gcc test.c -L. -lsqlite3 -o test
其中:
-L. 表示在当前目录下寻找动态库文件
这样动态库编译完成,将该动态库移植到arm的文件系统/lib中,重新烧录文件系统并可运行
静态库编译:
在上面新建的sqlite3目录下,执行
arm-linux-gcc -c sqlite3.c -lpthread -ldl -o sqlite3.o
ar -r libsqlite3.a sqlite3.o将列出的各个目标文件一起打包成一个静态库libsqlite3.a
其中,ar命令是将各个目标文件打包生成静态库
arm-linux-gcc test.c -L. -lsqlite3 -static -o test。也可不加-static选项(链接静态库)
② 为了在arm平台上支持sqlite3工具,需要移植libz.so.1, libncurses.so.5, libreadline.so.6
编译流程:
tar –zxvf zlib-1.2.6.tar.gz
cd zlib-1.2.6
prefix=/media/disk/mikechen/install/zlib CC=arm-linux-gcc CFLAGS="-O4" ./configure
上行参数配置请打开configure文件,如图
make && make install
这样在/media/disk/mikechen/install/zlib生成了libz.so.1动态库,将它移植到文件系统/lib
tar –zxvf ncurses-5.9.tar.gz
./configure --host=arm-linux --prefix=/media/disk/mikechen/install/ncurses --with-shared
注意:一定要加—with-shared,否则无法生产动态库
make && make install
这样在/media/disk/mikechen/install/ncurses/lib目录下生成了libncurses.so.5,将它移植到文件系统/lib
tar –zxvf readline-6.1.tar.gz
cd readline-6.1.tar.gz
./configure --host=arm-linux --prefix=/media/disk/mikechen/install/readline --with-shared
make && make install
这样在/media/disk/mikechen/install/ readline /lib目录下生成了libreadline.so.5,将它移植到文件系统/lib
以上生成的动态库,可能因版本不同,移植之后还是导致linux系统找不到动态库,可以通过软链接指向 ln –s 目标文件 源文件,如系统需要libreadline.so.5,而我编译之后生成的是libreadline.so.6,可以这样操作ln –s libreadline.so.6 libreadline.so.5,搞定
最后将①中/media/disk/mikechen/install/sqlite3/bin中的sqlite3工具移植到文件系统的/usr/sbin目录中,重新烧写文件系统到arm平台中,运行结果如下
如有疑问,qq:286103857