@geekpi
This commit is contained in:
Xingyu Wang 2019-11-04 12:07:11 +08:00
parent 89dfe533b9
commit 3e240f187f

View File

@ -1,6 +1,6 @@
[#]: collector: (lujun9972) [#]: collector: (lujun9972)
[#]: translator: (geekpi) [#]: translator: (geekpi)
[#]: reviewer: ( ) [#]: reviewer: (wxy)
[#]: publisher: ( ) [#]: publisher: ( )
[#]: url: ( ) [#]: url: ( )
[#]: subject: (SQLite is really easy to compile) [#]: subject: (SQLite is really easy to compile)
@ -10,22 +10,23 @@
SQLite 真的很容易编译 SQLite 真的很容易编译
====== ======
![](https://img.linux.net.cn/data/attachment/album/201911/04/120656cedfznzenxxvmxq1.jpg)
上周,我一直在做一个 SQL 网站(<https://sql-steps.wizardzines.com/>,一个 SQL 示例列表)。我使用 sqlite 运行网站上的所有查询,并且我想在其中一个例子([这个][1])中使用窗口函数。 上周,我一直在做一个 SQL 网站(<https://sql-steps.wizardzines.com/>,一个 SQL 示例列表)。我使用 sqlite 运行网站上的所有查询,并且我想在其中一个例子([这个][1])中使用窗口函数。
但是我使用的是 Ubuntu 18.04 中的 sqlite 版本,它太旧了,不支持窗口函数。所以我需要升级 sqlite 但是我使用的是 Ubuntu 18.04 中的 sqlite 版本,它太旧了,不支持窗口函数。所以我需要升级 sqlite
事实证明,这令人讨厌(通常),但是非常有趣!我想起了一些有关可执行文件和共享库如何工作的信息,结论令人满意。所以我想在这里写下来。 事实证明,这个过程超麻烦(如通常一样),但是非常有趣!我想起了一些有关可执行文件和共享库如何工作的信息,结论令人满意。所以我想在这里写下来。
(剧透:<https://www.sqlite.org/howtocompile.html> 中解释了如何编译 SQLite它只需花费 5 秒左右,这比我平时从源码编译的验容易了许多。) (剧透:<https://www.sqlite.org/howtocompile.html> 中解释了如何编译 SQLite它只需花费 5 秒左右,这比我平时从源码编译的验容易了许多。)
### 尝试 1从它的网站下载 SQLite 二进制文件 ### 尝试 1从它的网站下载 SQLite 二进制文件
[SQLite 的下载页面][2]有一个用于 Linux 的 SQLite 命令行工具的二进制文件的链接。我下载了它,它可以在笔记本电脑上运行,我以为这就完成了。 [SQLite 的下载页面][2]有一个用于 Linux 的 SQLite 命令行工具的二进制文件的链接。我下载了它,它可以在笔记本电脑上运行,我以为这就完成了。
但是后来我尝试在构建服务器 Netlify 上运行它得到了这个极其奇怪的错误消息“File not found”。我进行了追踪并确定 `execve` 返回错误代码 ENOENT这意味着 “File not found”。这有点令人发狂因为该文件确实存在并且有正确的权限。 但是后来我尝试在构建服务器Netlify 上运行它得到了这个极其奇怪的错误消息“File not found”。我进行了追踪并确定 `execve` 返回错误代码 ENOENT这意味着 “File not found”。这有点令人发狂因为该文件确实存在并且有正确的权限。
我搜索了这个问题(通过搜索 “execve enoen”找到了[这个 stackoverflow 中的答案][3],它指出要运行二进制文件,你不仅需要二进制文件存在!你还需要它的**加载程序**才能存在。(加载程序的路径在二进制文件内部)
我搜索了这个问题(通过搜索 “execve enoen”找到了[这个 stackoverflow 中的答案][3],它指出要运行二进制文件,你不仅需要二进制文件存在!你还需要它的**加载程序**才能存在。 (加载程序的路径在二进制文件内部)
要查看加载程序的路径,可以使用 `ldd`,如下所示: 要查看加载程序的路径,可以使用 `ldd`,如下所示:
@ -39,17 +40,17 @@ $ ldd sqlite3
/lib/ld-linux.so.2 /lib/ld-linux.so.2
``` ```
所以 `/lib/ld-linux.so.2` 是加载程序,而该文件在构建服务器上不存在,可能是因为 Xenial 安装程序不支持 32 位二进制文​​件(?),因此我需要尝试一些不同的东西。 所以 `/lib/ld-linux.so.2` 是加载程序,而该文件在构建服务器上不存在,可能是因为 XenialXenial 是 Ubuntu 16.04,本文应该使用的是 18.04 “Bionic Beaver”安装程序不支持 32 位二进制文​​件(?),因此我需要尝试一些不同的东西。
### 尝试 2安装 Debian sqlite3 软件包 ### 尝试 2安装 Debian sqlite3 软件包
好吧,我想我也许可以安装来自 [debian testing 的 sqlite 软件包][4]。尝试从另一个我不使用的 Debian 版本安装软件包并不是一个好主意,但是出于某种原因,我还是决定尝试一下。 好吧,我想我也许可以安装来自 [debian testing 的 sqlite 软件包][4]。尝试从另一个我不使用的 Debian 版本安装软件包并不是一个好主意,但是出于某种原因,我还是决定尝试一下。
这次毫不意外地破坏了我计算机上的 sqlite这也破坏了 git但我设法通过 `sudo dpkg --purge --force-all libsqlite3-0` 从中恢复,并使所有依赖于 sqlite 的软件再次工作。 这次毫不意外地破坏了我计算机上的 sqlite这也破坏了 git但我设法通过 `sudo dpkg --purge --force-all libsqlite3-0` 恢复,并使所有依赖于 sqlite 的软件再次工作。
### 尝试 3提取 Debian sqlite3 软件包 ### 尝试 3提取 Debian sqlite3 软件包
我还尝试仅从 Debian sqlite 软件包中提取 sqlite3 二进制文件并运行它。毫不意外,这也行不通,但这个更容易理解:我有旧版本的 libreadline.so.7),但它需要 .so.8。 我还尝试仅从 Debian sqlite 软件包中提取 sqlite3 二进制文件并运行它。毫不意外,这也行不通,但这个更容易理解:我有旧版本的 libreadline`.so.7`),但它需要 `.so.8`
``` ```
$ ./usr/bin/sqlite3 $ ./usr/bin/sqlite3
@ -58,7 +59,7 @@ $ ./usr/bin/sqlite3
### 尝试 4从源代码进行编译 ### 尝试 4从源代码进行编译
我花费这么多时间尝试下载 sqlite 二进制的原因是我认为从源代码编译 sqlite 既烦人又耗时。但是显然,下载随机的 sqlite 二进制文件根本不适合我,因此我最终决定尝试自己编译它。 我花费这么多时间尝试下载 sqlite 二进制的原因是我认为从源代码编译 sqlite 既烦人又耗时。但是显然,下载随便一个 sqlite 二进制文件根本不适合我,因此我最终决定尝试自己编译它。
这有指导:[如何编译 SQLite][5]。它是宇宙中最简单的东西。通常,编译的感觉是类似这样的: 这有指导:[如何编译 SQLite][5]。它是宇宙中最简单的东西。通常,编译的感觉是类似这样的:
@ -69,15 +70,12 @@ $ ./usr/bin/sqlite3
* 编译失败,因为我安装了错误版本的依赖 * 编译失败,因为我安装了错误版本的依赖
* 去做其他事,之后找到二进制文件 * 去做其他事,之后找到二进制文件
编译 SQLite 的方式如下: 编译 SQLite 的方式如下:
* [从下载页面下载整合的 tarball][[2] * [从下载页面下载整合的 tarball][2]
* 运行 `gcc shell.c sqlite3.c -lpthread -ldl` * 运行 `gcc shell.c sqlite3.c -lpthread -ldl`
* 完成!!! * 完成!!!
所有代码都在一个文件(`sqlite.c`)中,并且没有奇怪的依赖项!太奇妙了。 所有代码都在一个文件(`sqlite.c`)中,并且没有奇怪的依赖项!太奇妙了。
对我而言,我实际上并不需要线程支持或 readline 支持,因此我用编译页面上的说明来创建了一个非常简单的二进制文件,它仅使用了 libc 而没有其他共享库。 对我而言,我实际上并不需要线程支持或 readline 支持,因此我用编译页面上的说明来创建了一个非常简单的二进制文件,它仅使用了 libc 而没有其他共享库。
@ -102,7 +100,7 @@ via: https://jvns.ca/blog/2019/10/28/sqlite-is-really-easy-to-compile/
作者:[Julia Evans][a] 作者:[Julia Evans][a]
选题:[lujun9972][b] 选题:[lujun9972][b]
译者:[geekpi](https://github.com/geekpi) 译者:[geekpi](https://github.com/geekpi)
校对:[校对者ID](https://github.com/校对者ID) 校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出