SQLite 真的很容易编译

上周,我一直在作一个 SQL 网站(sql-steps.wizardzines.com/,一个 SQL 示例列表)。我使用 sqlite 运行网站上的全部查询,而且我想在其中一个例子(这个)中使用窗口函数。html

可是我使用的是 Ubuntu 18.04 中的 sqlite 版本,它太旧了,不支持窗口函数。因此我须要升级 sqlite!linux

事实证实,这个过程超麻烦(如一般同样),可是很是有趣!我想起了一些有关可执行文件和共享库如何工做的信息,结论使人满意。因此我想在这里写下来。git

(剧透:www.sqlite.org/howtocompil… 中解释了如何编译 SQLite,它只需花费 5 秒左右,这比我平时从源码编译的体验容易了许多。)github

尝试 1:从它的网站下载 SQLite 二进制文件

SQLite 的下载页面有一个用于 Linux 的 SQLite 命令行工具的二进制文件的连接。我下载了它,它能够在笔记本电脑上运行,我觉得这就完成了。sql

可是后来我尝试在构建服务器(Netlify) 上运行它,获得了这个极其奇怪的错误消息:“File not found”。我进行了追踪,并肯定 execve 返回错误代码 ENOENT,这意味着 “File not found”。这有点使人发狂,由于该文件确实存在,而且有正确的权限。shell

我搜索了这个问题(经过搜索 “execve enoen”),找到了这个 stackoverflow 中的答案,它指出要运行二进制文件,你不只须要二进制文件存在!你还须要它的加载程序才能存在。(加载程序的路径在二进制文件内部)bash

要查看加载程序的路径,可使用 ldd,以下所示:服务器

$ ldd sqlite3
    linux-gate.so.1 (0xf7f9d000)
    libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xf7f70000)
    libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf7e6e000)
    libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xf7e4f000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7c73000)
    /lib/ld-linux.so.2
复制代码

因此 /lib/ld-linux.so.2 是加载程序,而该文件在构建服务器上不存在,多是由于 Xenial(Xenial 是 Ubuntu 16.04,本文应该使用的是 18.04 “Bionic Beaver”)安装程序不支持 32 位二进制文​​件(?),所以我须要尝试一些不一样的东西。ionic

尝试 2:安装 Debian sqlite3 软件包

好吧,我想我也许能够安装来自 debian testing 的 sqlite 软件包。尝试从另外一个我不使用的 Debian 版本安装软件包并非一个好主意,可是出于某种缘由,我仍是决定尝试一下。函数

此次绝不意外地破坏了我计算机上的 sqlite(这也破坏了 git),但我设法经过 sudo dpkg --purge --force-all libsqlite3-0 恢复了,并使全部依赖于 sqlite 的软件再次工做。

尝试 3:提取 Debian sqlite3 软件包

我还尝试仅从 Debian sqlite 软件包中提取 sqlite3 二进制文件并运行它。绝不意外,这也行不通,但这个更容易理解:我有旧版本的 libreadline(.so.7),但它须要 .so.8

$ ./usr/bin/sqlite3
./usr/bin/sqlite3: error while loading shared libraries: libreadline.so.8: cannot open shared object file: No such file or directory
复制代码

尝试 4:从源代码进行编译

我花费这么多时间尝试下载 sqlite 二进制的缘由是我认为从源代码编译 sqlite 既烦人又耗时。可是显然,下载随便一个 sqlite 二进制文件根本不适合我,所以我最终决定尝试本身编译它。

这有指导:如何编译 SQLite。它是宇宙中最简单的东西。一般,编译的感受是相似这样的:

  • 运行 ./configure
  • 意识到我缺乏依赖
  • 再次运行 ./configure
  • 运行 make
  • 编译失败,由于我安装了错误版本的依赖
  • 去作其余事,以后找到二进制文件

编译 SQLite 的方式以下:

全部代码都在一个文件(sqlite.c)中,而且没有奇怪的依赖项!太奇妙了。

对我而言,我实际上并不须要线程支持或 readline 支持,所以我用编译页面上的说明来建立了一个很是简单的二进制文件,它仅使用了 libc 而没有其余共享库。

$ ldd sqlite3
    linux-vdso.so.1 (0x00007ffe8e7e9000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbea4988000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fbea4d79000)
复制代码

这很好,由于它使体验 sqlite 变得容易

我认为 SQLite 的构建过程如此简单很酷,由于过去我很乐于编辑 sqlite 的源码来了解其 B 树的实现方式。

鉴于我对 SQLite 的了解,这并不使人感到意外(它在受限环境/嵌入式中确实能够很好地工做,所以能够以一种很是简单/最小的方式进行编译是有意义的)。 但这真是太好了!


via: jvns.ca/blog/2019/1…

做者:Julia Evans 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

相关文章
相关标签/搜索