SQLite3源码在Linux下编译

SQLite3源码在Linux下编译

(1)编译命令行管理工具:gcc shell.c sqlite3.c -lpthread -ldl -o sqlite3  //将生成sqlit3命令行管理工具
   
(2)编译SQLite为单独的动态链接库:gcc sqlite3.c -lpthread -ldl -fPIC -shared -o libsqlite3.so    
    -fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

    -shared:表示生成一个共享目标文件(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),即我们所说的动态链接库。它可以和其他目标文件连接产生可执行文件。只有部分系统支持该选项。

    pthread系统库用于确保SQLite是线程安全的。但因为命令行工具是单线程的,对命令行工具则可编译成非线程安全的,以忽略pthread库。命令为gcc -DSQLITE_THREADSAFE=0 shell.c sqlite3.c -ldl -o sqlite3。dl系统库用于支持动态装载,sqlite3_load_extension()接口和SQL函数load_extension()需要用到它。如果不需要这些特性,可以使用SQLITE_OMIT_LOAD_EXTENSION编译选项来忽略,如gcc -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION shell.c sqlite3.c -o sqlite3。

    使用动态库libsqlite3.so:在你的程序中(例如test.c)通过包含头文件sqlite3.h来使用库中的函数,编译程序的命令为gcc test.c -L. -lsqlite3 -o test。其中-L.表示让链接库的搜索路径包含当前目录,-lsqlite3指明编译器查找动态库libsqlite3.so,编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称。通过ldd test可查看test程序是如何调用动态库中的函数的。

    调用动态库时有几个问题会经常碰到。有时明明已经将库的头文件所在目录通过 “-I” include进来了,库所在文件通过 “-L”参数引导,并指定了“-l”的库名,但通过ldd命令察看时,就是死活找不到你指定链接的so文件,这时你要作的就是修改LD_LIBRARY_PATH,这个环境变量指示动态连接器可以装载动态库的路径。或者修改/etc/ld.so.conf文件,然后调用/sbin/ldconfig来达到同样的目的。通常这样做就可以解决库无法链接的问题了。


(3)编译成静态库:gcc -c sqlite3.c -lpthread -ldl -o sqlite3.o  //编译成目标文件
             ar -r libsqlite3.a sqlite3.o  //将列出的各个目标文件一起打包成一个静态库libsqlite3.a

    链接静态库:gcc test.c -L. -lsqlite3 -static -o test  //也可不加-static选项

posted @ 2020-10-16 10:23  唐朝Coding  阅读(2795)  评论(0编辑  收藏  举报