《2022年sqlite-..编译安装与交叉编译全过程详细记录 .pdf》由会员分享,可在线阅读,更多相关《2022年sqlite-..编译安装与交叉编译全过程详细记录 .pdf(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、sqlite-3.3.6 编译安装与交叉编译全过程详细记录下文介绍的内容都是基于Linux RedHat 9.0 平台的。一、PC 机编译安装请阅读在安装包里的INSTALL 文件。或者使用PEAR installer with pear install sqlite。SQLite 已经内置了,你不需要安装任何附加的软件(additional software)。Windows users 可以下载 SQLite 扩展 DLL(php_sqlite.dl)。这里简单介绍一下:假设你得到的是源代码sqlite-3.3.6.tar.gz,这里将告诉你怎么编译它。解压 sqlite-3.3.6.ta
2、r.gz 到/home 目录下For example:tar zxvf sqlite-3.3.6.tar.gz-C/home cd/home mkdir sqlite-ix86-linux cd/home/sqlite-ix86-linux/./sqlite-3.3.6/configure-prefix=/home/sqlite-ix86-linux/编译并安装,然后生成帮助文档make&make install&make doc 如果出现下列错误./sqlite-3.3.6/src/tclsqlite.c:In function DbUpdateHandler:./sqlite-3.3.6/
3、src/tclsqlite.c:333:warning:passing arg 3 of Tcl_ListObjAppendElement makes pointer from integer without a cast./sqlite-3.3.6/src/tclsqlite.c:In function tclSqlFunc:./sqlite-3.3.6/src/tclsqlite.c:419:warning:passing arg 1 of Tcl_NewByteArrayObj discards qualifiers from pointer target type 这个都是tcl 相关
4、的错误,可以先安装ActiveTcl 以解决.假如你不需要tcl 支持,那么这个错误可以这样避免:cd/home/sqlite-ix86-linux/./sqlite-3.3.6/configure-disable-tcl-prefix=/home/sqlite-ix86-linux/编译并安装,然后生成帮助文档make&make install&make doc 不出意外,将不会出现错误,那么库文件已经生成在/home/sqlite-ix86-linux/lib 目录下可执行文件sqlite3 已经生成在/home/sqlite-ix86-linux/bin 目录下下面创建一个新的数据库文件
5、名叫zieckey.db(当然你可以使用不同的名字)来测试数据库.直接输入:/home/sqlite-ix86-linux/bin/sqlite3 test.db 如果出现下面字样表明编译安装已经成功了.SQLite version 3.3.6 Enter.help for instructions sqlite 二、交叉编译sqlite.3.3.6.tar.gz 库文件tar zxvf sqlite-3.3.6.tar.gz-C/home(这一步前面已经有了,为了完整性,这里还是写出来)mkdir/home/sqlite-arm-linux 名师资料总结-精品资料欢迎下载-名师精心整理-第
6、1 页,共 9 页 -设置交叉编译环境export PATH=/usr/local/arm-linux/bin:$PATH cd/home/sqlite-arm-linux/./sqlite-3.3.6/configure-disable-tcl-prefix=/home/sqlite-arm-linux/-host=arm-linux 这步出现错误而没有生成Makefile configure:error:unable to find a compiler for building build tools 前面检查 arm-linux-gcc 都通过了,怎么还说没有找到编译器呢?花了点时间看
7、configure 的脚本,太复杂了,又结合configure.ac 看了一下。原来是要设置config_TARGET_CC和 config_BUILD_CC两个环境变量。config_TARGET_CC是交叉编译器,config_BUILD_CC是主机编译器。重来:export config_BUILD_CC=gcc export config_TARGET_CC=arm-linux-gcc./sqlite-3.3.6/configure-disable-tcl-prefix=/home/sqlite-arm-linux/-host=arm-linux 又出现如下错误checking for
8、/usr/include/readline.h.configure:error:cannot check for file existence when cross compiling 说 readline.h 的错,找到 readline.h 在/usr/include/readline/readline.h 目录,我想这样解决ln-s/usr/include/readline/readline.h/usr/include/readline.h 但还是不行./sqlite-3.3.6/configure-disable-tcl-prefix=/home/sqlite-arm-linux/-h
9、ost=arm-linux 还是出现如下同样的错误checking for/usr/include/readline.h.configure:error:cannot check for file existence when cross compiling 上面说是要检查交叉编译环境,我可以肯定我的交叉编译环境是正确的,所以我决定欺骗configure,我是这样做的cd/home/sqlite-3.3.6 将该目录下的configure 文件的部分内容修改下(这里是根据test$cross_compiling=yes&找到的),这样可以让configure 不去检查你的交叉编译环境。2042
10、0 行 (exit 1);exit 1;改为(echo 1);echo 1;20446 行 (exit 1);exit 1;改为(echo 1);echo 1;在回去重新配置下:cd/home/sqlite-arm-linux/./sqlite-3.3.6/configure-disable-tcl-prefix=/home/sqlite-arm-linux/-host=arm-linux 中间打印信息出现如下错误信息,checking for/usr/include/readline.h.configure:error:cannot check for file existence when
11、 cross compiling 但是还是生成了Makefile 文件一个libtool 脚本,这些将在make 时用到.注意:如果 Makefile 文件中有如下语句BCC=arm-linux-gcc-g-O2 请将其改掉,改成:名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 9 页 -BCC=gcc-g-O2 编译并安装make&make install 这里如果不出意外,将不会出现错误,那么库文件已经生成在/home/sqlite-ix86-linux/lib 目录下 好了,就到这里。sqlite-3.3.17 交叉编译说明1、在 Redhat Linux9 上用 arm-
12、linux-gcc 编译成功sqlite-3.3.17 静态库版本。2、在 Redhat Linux9 上用 arm-linux-gcc 编译成功sqlite-3.3.17 动态库版本。3、在 Redhat Linux9 上用 arm-linux-gcc 编译成功基于sqlite3 静态库的应用程序。4、在 Redhat Linux9 上用 arm-linux-gcc 编译成功基于sqlite3 动态库的应用程序。/=/Compile SQLite using the cross-compiler such as arm-linux-gcc 1.first,get sqlite-3.3.17.
13、tar.gz from www.sqlite.org2.unzip it#tar-zxvf sqlite-3.3.17.tar.gz 3.change into the sqlite-3.3.17 directory cd sqlite-3.3.17 4.make a new directory such as build under sqlite-3.3.17 directory,mkdir sqlite-arm-linux 5.First,Please ensure the cross compiler arm-linux-gcc included in PA TH,Use echo$PA
14、TH,you can look out the PATH,if no,Set the path:export PATH=/usr/local/arm/2.95.3/bin:$PATH 6.3.3.17 版本的 configure 和 Makefile 都不需改动7.change into the build directory you created cd sqlite-arm-linux 8.call the edited configure script from the sqlite directory by using the following option:./configure-
15、disable-tcl-host=arm-linux 9.After that configure should have created a Makefile and a libtool script in your build directory.10.run make command to create the sqlite3 execute file,after a successful compile 11.Now you should find a hiden“.libs”directory in your build directory containing sqlite sha
16、red object files,like libsqlite3.so or static libray files like libsqlite3.a.12.use file sqlite3 to look the inf of sqlite3,run arm-linux-strip sqlite3 to decrease the execute file size.13.upload the sqlite3 to target ARM9 board by any FTP client and make it executive:14.on ARM9 board with terminal
17、or telnet,run chmod 775 sqlite3 15.and then run sqlite3 like this sqlite3 ex2 16.,if you see the following messages:SQLite version 3.3.17 Enter.help for instructions 名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 9 页 -sqlite 在 ARM-Linux平台上移植SQLite 1、软硬件平台本文中采用的硬件平台为Sitsang 嵌入式评估板。Sitsang评估板的核心是PXA255 嵌入式处理器。底层软件系统是
18、以ARM-Linux内核为基础的。要将 SQLite3 移植到 Sitsang 评估板上,除了要有底层操作系统的支持外,还必须要有相应的交叉编译工具链。由于Sitsang 评估板采用的是ARM-Linux作为底层操作系统,因此需要首先安装ARM-Linux工具链。关于ARM-Linux工具链的安装可以参阅文献4。ARM-Linux 工具链通常安装在/usr/local/arm-linux/bin/目录下,通常以 arm-linux-开头。本文中将会涉及到的主要是arm-linux-gcc、arm-linux-ar、arm-linux-ranlib这样三个工具。2、移植过程首先从http:/sq
19、lite.org下载 SQLite 3.4.2。本文中假设将sqlite-3.4.2.tar.gz 下载到/home/liyan/sqlite 目录下。然后,通过下列命令解压缩sqlite-3.4.2.tar.gz 并将文件和目录从归档文件中抽取出来:#tar zxvf sqlite-3.4.2.tar.gz 解压抽取完成之后将会在/home/liyan/sqlite 目录下生成一个sqlite-3.4.2/子目录,在该目录中包 含 了 编 译 所 需 要 的 所 有 源 文 件 和 配 置 脚 本。SQLite3的 所 有 源 代 码 文 件 都 位 于sqlite-3.4.2/src/目录
20、下。和在 PC环境下编译SQLite3 不同,不能通过 sqlite-3.4.2/目录下的 configure 脚本来生成Makefile文件。取而代之的是必须手动修改Makefile 文件。在 sqlite-3.4.2/目录下有一个Makefile 范例文件Makefile.linux-gcc。首先通过下面的命令拷贝此文件并重命名为Makefile:#cp Makefile.linux-gcc Makefile 接下来,用vim 打开 Makefile 文件并手动修改Makefile 文件的内容。首先找到Makefile 文件中的下面这样一行:TOP=./sqlite 将其修改为:TOP=.
21、找到下面这样一行:TCC=gcc-O6 将其修改为:TCC=arm-linux-gcc-O6 找到下面这样一行:AR=ar cr 将其修改为:AR=arm-linux-ar cr 找到下面这样一行:RANLIB=ranlib将其修改为:RANLIB=arm-linux-ranlib 找到下面这样一行:MKSHLIB=gcc-shared 将其修改为:MKSHLIB=arm-linux-gcc-shared 注释掉下面这一行:TCL_FLAGS=-I/home/drh/tcltk/8.4linux 注释掉下面这一行:LIBTCL=/home/drh/tcltk/8.4linux/libtcl8.
22、4g.a-lm-ldl vi 中的查找方法:在命令模式下输入“?”加要查找的字符串,再回车。输入“n”为查找下一处。原则上,对Makefile的修改主要包括两个方面:首先是将编译器、归档工具等换成交叉工具链中的对应工具,比如,gcc 换成 arm-linux-gcc,ar 换成 ar-linux-ar,ranlib 换成 arm-linux-ranlib等等;其次是去掉与TCL 相关的编译选名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 9 页 -项,因为默认情况下,将会编译SQLite3 的 Tcl 语言绑定,但是在移植到ARM-Linux的时候并不需要,因此将两个与 TCL
23、有关的行注释掉。接下来,还需要修改的一个的文件是main.mk,因为 Makefile 包含了这个文件。找到这个文件中的下面一行:select.o table.o tclsqlite.o tokenize.o trigger.o 把它替换成:select.o table.o tokenize.o trigger.o 也就是把该行上的tclsqlite.o 去掉。这样编译的时候将不会编译SQLite3 的 Tcl 语言绑定。自此,修改工作就完成了,接下来就可以开始编译SQLite3 了,这通过 make 命令即可完成:#make 编译完成之后,将在sqlite3.4.2/目录下生成库函数文件li
24、bsqlite3.a 和头文件sqlite3.h,这就是所需要的两个文件了。3、测试这里以SQLite官方站点http:/sqlite.org的 quick start 文档中的测试程序为例对移植到ARM-Linux上的 SQLite3 进行测试。该程序清单如下:#include#include static int callback(void*NotUsed,int argc,char*argv,char*azColName)int i;for(i=0;i&5#echo$as_me:error:unable to find a compiler for building build tool
25、s&2;#(exit 1);exit 1;#fi.#else#test$cross_compiling=yesecho$as_me:13264:error:cannot check for file existence when cross compiling&5#echo$as_me:error:cannot check for file existence when cross compiling&2;#(exit 1);exit 1;.#else#test$cross_compiling=yesecho$as_me:13464:error:cannot check for fil
26、e existence when cross compiling&5#echo$as_me:error:cannot check for file existence when cross compiling&2;#(exit 1);exit 1;.#else#test$cross_compiling=yesecho$as_me:13490:error:cannot check for file existence when cross compiling&5#echo$as_me:error:cannot check for file existence when cross compi
27、ling&2;#(exit 1);exit 1;注释掉后,就可以执行configure 了。在 sqlite-arm-linux 目录下,输入如下命令:名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 9 页 -./sqlite/configure-host=arm-linux 这样在你的build 目录中就将生成Makefile 和一个 libtool 脚本,这些将在make 时用到。5、修改 Makefile 文件请修改 Makefile 文件,将下面的这行BCC=arm-linux-gcc-g-O2 改掉,改成:BCC=gcc-g-O2 一般地,我们都是将sqlite 放到
28、arm-linux 的硬件板子上运行,所以我们一般将其编译成静态链接的形式。如果是共享so 库的话,比较麻烦。所以继续修改Makefile,找到如下地方:sqlite:将有其后的“libsqlite.la”改成“.libs/libsqlite.a”大功告成,现在可以make 了。应该不会出错,生成 sqlite,libsqlite.a,libsqlite.so。你可以使用命令:find-name sqlite;find-name*.a;find-name*.so查看文件所在的目录。此时生成的sqlite 文件是还未strip 过的,你可以使用命令“file sqlite”查看文件信息。用str
29、ip处理过后,将去掉其中的调试信息,执行文件大小也将小很多。命令如下:arm-linux-strip sqlite 第二步在 arm 板上运行sqlite 将 sqlite 拷贝到你的arm 板上,方法很多,你需要根据自己的情况来选择。如 ftp,cmdftp,wget等。我的方法是使用wget 将 sqlite 下载到 arm 板的/tmp 目录,此目录是可写的。命令如下:busybox wget ftp:/192.168.0.100/sqlite上面的命令,你可以看到我的板子上是已经有busybox 来支持 wget 命令了的。:-)好,开始运行chmod+wx sqlite./sqlit
30、e test.sqlite 会出现sqlite 提示符号,打个“.help”来看看命令先:-)sqlite.help 好了。现在 sqlite 已经在 arm-linux 下跑了起来。如何,感觉不错吧,在 arm 板子上玩玩“select*from”语句蛮爽吧:-)友情提示:如果 sqlite 在处理数据库过程中出现“The database disk image is malformed”,如:你在delete from sometable 时,可能遇到这个问题。那么就是你的arm 板上的空间不够(如在/tmp 下),请删除掉一些文件。我遇到的情况是空间还剩 1-2M 都会出现这个提示。删除
31、后空余4M,就正常了(如 delete from sometable)。我是开的8M 的 ramdisk 做开发玩的:-)名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 9 页 -谢谢阅读。欢迎转载,但请写明出处。Undefined reference to dlsym 1)I checked out the code to directory called sqlite 2)I modified the Makefile.in to allow loading extensions.We have to comment the following line#TCC+=-DSQL
32、ITE_OMIT_LOAD_EXTENSION=1 3)Created a directory called build.Ran configure and make from there.4)I get undefined refernce to dlsym,dlopen,dlclose error.Apparently the problem is with SQLite failing to find dynamic linker library.I added LDFLAGS to command line before running make Like this:LDFLAGS=-
33、ldl make.Still it fails.Please tell me what is the error.Youll end up with a Makefile(and several other files)in this directory.Edit this mmakefile and comment out the line:TCC+=-DSQLITE_OMIT_LOAD_EXTENSION=1 I found this to be necessary to avoid errors later when I compile the shell.c(the sqlite3 C
34、LP).You may also what to edit the line TLIBS=to read TLIBS=-ldl Now do the following to compile and install:/dev/build$make After the make you will have a directory full of object files and the sqlite CLP executable called sqlite3/dev/build$sudo make install New libraries will be installed as/usr/lo
35、cal/lib/libsqlite3.a and/usr/local/lib/libsqlite3.so.0.8.6(The former being the static lib and the later the shared lib).The sqlite3 executable is also installed in/usr/local/bin/.Now make the amalgamated sqlite source file:/dev/build$make sqlite3.c You end up with a very large source file sqlite3.c
36、 and the header sqlite3.h which are essentially what you need to embed sqlite in your applications.You also have individual source files under the/dev/build/tsrc/.You will also find shell.c here-this is the source used to build the CLP.To build the CLP using shared library:/dev/build$gcc-O2-o sqlite
37、3 tsrc/shell.c-ldl-lsqlite3 Note that-lpthread is not required since shell.c does not require it.Youll end up with a 39k sqlite3 executable file.To build the CLP with the sqlite embedded:/dev/build$gcc-O2-o sqlite3 tsrc/shell.c sqlite3.c-ldl-lpthread I 名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 9 页 -end up with
38、 and executable of just under 380k size.Note that-lpthread needs to be specified since sqlite3.c uses it(I think).Im not sure how the static library can be used.When I try/dev/build$gcc-O2-o sqlite3 tsrc/shell.c-ldl-lpthread-l:libsqlite3.a I end up with an executable of 1.4MB in size.It still works
39、but I think its not right When cross-compiling sqlite-3.4.0,I encounter this linkage error:./.libs/libsqlite3.so:undefined reference to dlclose./.libs/libsqlite3.so:undefined reference to dlopen./.libs/libsqlite3.so:undefined reference to dlsym The solution:=I added in Makefile.in the-ldl at the end
40、 of the line.-sqlite3$(TEXE):$(TOP)/src/shell.c libsqlite3.la sqlite3.h$(LTLINK)$(READLINE_FLAGS)$(LIBPTHREAD)-o$(TOP)/src/shell.c libsqlite3.la$(LIBREADLINE)$(TLIBS)-ldl My configure command is:-./configure-build=i686-linux -host=powerpc-wrs-linux-gnu -prefix=/usr/local -disable-tcl -disable-debug
41、-with-gnu-ld -enable-threadsafe -enable-releasemode -disable-static sqlite 移植到 arm-linux 不过他们用的sqlite 版本相对都要老一些,有很多说明已经不太实用。以下引用yeshi 的文章,来自http:/ http:/www.sqlite.org/download.html上下载 sqlite-3.3.13.tar.gz$tar-zxvf sqlite-3.3.13.tar.gz/sqliteforuclinux/$cd sqliteforuclinux/sqlite-3.3.13 查看 readme,内容
42、为:For example:tar xzf sqlite.tar.gz;#Unpack the source tree into sqlite mkdir bld;#Build will occur in a sibling directory cd bld;#Change to the build directory./sqlite/configure;#Run the configure script make;#Run the makefile.名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 9 页 -make install;#(Optional)Install the
43、build products 我们现在要做的是交叉编译,要是为本机编译,可以照做就可以了$mkdir bld$cd bld export config_BUILD_CC=gcc export config_TARGET_CC=arm-linux-gcc 修改 bld/目录下的configure 文件的部分内容20420 行 (exit 1);exit 1;改为(echo 1);echo 1;20446 行 (exit 1);exit 1;改为(echo 1);echo 1;$./sqlite-3.3.13/configure-disable-tcl-prefix=/home/yeshi/sql
44、iteforuclinux/bld-host=arm-linux 将/bld/Makefile文件中如下语句BCC=arm-linux-gcc-g-O2 改成:BCC=gcc-g-O2/红色字体的是上面贴子上的,我的不用改的,已经是BCC=gcc-g(我的也已经不需要改)$make$make install bld/lib 目录下,库文件已经生成在为了减小执行文件大小可以用strip 处理,去掉其中的调试信息。arm-linux-strip libsqlit3.so.0 在这个过程中起先遇到了不认识编译器的问题,修改环境变量解决问题,而这个文章中没有提到的是link tag 的问题,要修改一下makefile 文件,把-tag=arm-linux 放到 libtool 字段的 link 段的后面,去掉$(TCC),或者在$(TCC)之前空一格然后添上-tag=CC uclinux 下的 sqlite 嵌入式数据库移植我们在这里讨论的是比较流行的嵌入式开发组合ARM+uc linux,即目标开发板为三星名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 9 页 -