原始标题:实际上SQLite很容易编译
上周,我在一个数据库网站上工作(https://sql-steps.wizardzines.com/,一个数据库示例列表)我使用sqlite来运行网站上的所有查询,我想在一个例子中使用一个窗口函数(这个)然而,我使用的是Ubuntu 18.04的sqlite版本,它太旧了,不支持窗口功能。所以我需要升级sqlite!事实证明,这个过程极其麻烦(和往常一样),但非常有趣!我想到了一些关于可执行文件和共享库如何工作的信息,结论是令人满意的。所以我想把它写在这里
尝试1:从其网站下载SQLite二进制文件
SQLite的下载页面有一个指向用于Linux的SQLite命令行工具的二进制文件的链接我下载了它,它可以在笔记本电脑上运行。我以为已经结束了。
,但后来我试图在构建服务器(Netlify)上运行它,得到了一个非常奇怪的错误消息:“找不到文件。”我跟踪了它,并确保execve返回了错误代码ENOENT,意思是“找不到文件”这有点疯狂,因为该文件确实存在并且具有正确的权限。
我搜索了这个问题(通过搜索“精确的enoen”)并在这个stackoverflow中找到了答案,它指出要运行二进制文件,您不仅需要二进制文件的存在!你也需要它的加载器存在。(加载程序的路径在二进制文件中)要查看加载程序的路径,您可以如下使用ldd:
$ LDD SqLite 3
/lib/i386-Linux-GNU/libm . so . 6(0xf 7e 6e 000)
libz . so . 1 = & gt。/lib/i386-Linux-GNU/libz . so . 1(0xf 7e 4f 000)
libc . so . 6 = & gt。/lib/i386-Linux-GNU/libc . so . 6(0x f7c 73000)
/lib/LD-Linux . so . 2
so/lib/LD-Linux . so . 2是加载程序,该文件不存在于生成服务器上。这可能是因为Xenial(Xenial是Ubuntu 16.04和18.04“仿生海狸”应该在本文中使用)安装程序不支持32位二进制文件(?),所以我需要尝试一些不同的东西。
尝试2:安装Debian sqlite3软件包
好的,我想我可以通过Debian测试安装sqlite软件包尝试从我不使用的另一个Debian版本安装软件包不是一个好主意,但是出于某种原因,我决定尝试一下。
这次没有意外破坏我计算机上的sqlite(也破坏了git),但是我设法通过Sudodkg-Pure-Force-Alllib sqlite 3-0恢复,并使所有依赖于SQLite的软件再次工作。
尝试3:提取Debian sqlite包
我还尝试只从Debian sqlite包中提取SQLite二进制文件并运行它毫不奇怪,这也不起作用,但这更容易理解:我有旧版本的libreadline(.so.7),但它需要。so.8。
美元。/usr/bin/sqlite3
。/usr/bin/ SQLite3:错误加载共享库时:libreadline . so . 8:can not penshared object file:nosuchfileordirector
尝试4:编译
我花这么多时间尝试下载SQLite二进制文件的原因是我认为从源代码编译sqlite既烦人又耗时。但是显然,下载任何sqlite二进制文件都不适合我,所以我最终决定自己编译它。
这是如何编译SQLite的指南这是宇宙中最简单的事情一般来说,编译感觉是这样的:
运行。/configure
意识到我缺少再次运行的依赖项
。/configure
运行make
编译失败,因为我安装了错误版本的依赖项
来执行其他操作。然后找到二进制文件
,并按如下方式编译SqLite:
从下载页面下载集成tarball
并运行gcc shell。cSQLite 3。c-lpthread-LDL
完成!!!
所有代码都在一个文件中,没有奇怪的依赖关系!极好的
对我来说,我实际上不需要线程支持或读线支持,所以我使用编译页面上的指令创建了一个非常简单的二进制文件,它只使用libc,不使用其他共享库
$ ldd SQLite 3
Linux-vdso . so . 1(0x 00007 FFE 8e 7e 9000)
libc . so . 6 = & gt。/lib/x86 _ 64-Linux-GNU/libc . so . 6(0x 00007 fbea 498800)
/lib 64/LD-Linux-x86-64 . so . 2(0x 00007 fbea 4d 79000)
这很好。因为它使体验sqlite
变得容易,我认为sqlite的构建过程是如此简单和酷,因为在过去我非常乐意编辑sqlite的源代码来理解它的B树的实现。
鉴于我对SQLite的了解,这并不奇怪(它在受限/嵌入式环境中工作良好,因此以非常简单/最小的方式进行编译是有意义的)但这真的很棒!