1/下载源码
在官网下载源码
2017年7月2日20:24:05 下载了sqlite-autoconf-3190300.tar.gz
2/拆包
tar xvf sqlite-autoconf-3150200.tar.gz
该命令敲击之后会在当前目录下生成一个文件夹,文件夹下是源码
3/cd进去解压生成的文件夹
4/运行configure脚本,生成Makefile(注意选项)
./configure --prefix=$PWD/sqlite3_install --host=arm-none-linux-gnueabi
一般源码目录下都有configure脚本,该脚本是对当前系统进行检测,并生成一个Makefile ,移植源码到arm板的时候,一般都要填入一些选项,这些选项就是configure脚本里面的变量.
一般情况下要填入安装目录/目标主机/编译器,当然不限于这三者
注意:
--host 的取值与交叉编译器的取值保持一致
根据--host来确定运行在哪个平台,使用哪个交叉编译器
--host=arm-none-linux-gnueabi的意思是使用arm-none-linux-gnueabi交叉编译工具链
另外,可以根据CC来确定具体目录,也可以不写.不写的话,根据PATH变量中的路径查找命令
注意:每个已经编译好的交叉编译工具链都对应一种C库
据我所知,库有 glibc、uClibc、dietlibc、newlib这么几种,当然还有可能更多.
关于C库与编译器的关系请参考交叉编译工具链环境的搭建__1
5/编译
make
如果提示要权限,可以用chown 来解决
6/安装
sudo make install
我们这篇文章里面用的是当前用户家目录下的文件夹作为安装目录,所以没有必要用sudo
可以用make install
此时会当前文件夹创建一个名为sqlite3_install的文件夹,并在该目录创建一些文件夹 bin include lib share
7/剥离调试信息
剥离调试信息是为了将文件里面的调试信息去掉,因为嵌入式的硬件资源有限
如果你注意的话,编译的时候会有一个选项,就是 -g,加上这个选项的话,会在目标文件中生成调试信息,目的是为了gdb调试用.
arm-none-linux-gnueabi-strip sqlite3
arm-none-linux-gnueabi-strip libsqlite3.so.0.8.6
注意:这里要使用的工具必须是arm-none-linux-gnueabi,即和之前编译使用的工具是一系列产品
8/移植
将 sqlite3 复制到 usr/bin/目录下
将libsqlite3.so.0.8.6 复制到 lib/目录下
将 sqlite3ext.h sqlite3.h 文件复制到 inlcude/目录下
创建软链接
ln -s libsqlite3.so.0.8.6 libsqlite3.so.0
ln -s libsqlite3.so.0.8.6 libsqlite3.so
为什么不创建硬链接呢?
创建硬链接,删除源文件并不会删除链接文件的内容.
创建软链接,删除源文件,会清空连接文件的内容.
编译时寻找libz.so,但并不使用,只是查找是否存在(linkername)
运行时寻找libz.so.1,并加载到内存,其实加载的还是libz.so.1.2.8(soname)
实际上是libz.so.1.2.8,其他的都是链接出来的(realname)
宿主机使用库文件编译:
在主机平台上编译你写的代码的时候,需要 .h文件和 .so文件的支持
- 把/usr/local/sqlite_result/include中的文件都复制到对应编译工具链的include路径下
- 把/usr/local/sqlite_result/lib中的所有文件都复制到对应编译工具链的lib目录下
然后,你写代码的时候就可以用
#include <sqlite3.h>
编译的时候用
arm-none-linux-gnueabi-gcc -o file_target file_source -lsqlite3
因为这是第三方库,用的时候要用-l[name]来链接动态
ranlib命令找不到,解决方案
当运行sudo make install的时候
./libtool: line 1720: arm-hisiv300-linux-ranlib: command not found
make[1]: *** [install-libLTLIBRARIES] Error 127
make[1]: Leaving directory `/home/pop/src/untils/sqlite-autoconf-3190300'
make: *** [install-am] Error 2
PATH变量在/etc/profile中被修改
问题发生后,echo $PATH ,发现PATH变量里面有该命令的路径
所以怀疑是sudo 的过程中,修改了PATH
man sudo
在ENVIRONMENT 发现
PATH May be overridden by the security policy.
//做了个实验,
echo "echo \$PATH" > test.sh
chmod +x
sudo ./test.sh
//结果为没有包含ranlib 命令的路径
所以解决方案为
在make install前选择用 su - 切换root用户,然后再用make install 来安装
本页之外
sqlite3 退格键不能用,移植到x86平台,解决方案
sudo apt-get install libreadline-dev//这个是为了解决按键控制的问题