当前位置: 首页 > 科技观察

SQLite真的很容易编译

时间:2023-03-12 06:44:09 科技观察

上周,我一直在做一个SQL网站(https://sql-steps.wizardzines.com/,一个SQL示例列表)。我使用sqlite在我的网站上运行所有查询,并且我想在其中一个示例(这个示例)中使用窗口函数。但是我在Ubuntu18.04中使用的sqlite版本太旧,无法支持窗口功能。所以我需要升级sqlite!结果证明它非常麻烦(像往常一样)但很有趣!我想起了一些关于可执行文件和共享库是如何工作的,结论是令人满意的。所以我想在这里写下来。(剧透:https://www.sqlite.org/howtocompile.html解释了如何编译SQLite,只需要大约5秒,这比我通常从源代码编译的经验要容易得多。)尝试1:从其网站下载SQLite二进制文件SQLite下载页面有一个指向用于Linux的SQLite命令行工具的二进制文件的链接。我下载了它,它可以在我的笔记本电脑上运行,我认为就是这样。但是后来我尝试在构建服务器(Netlify)上运行它并收到这个非常奇怪的错误消息:“找不到文件”。我追踪并确定execve返回错误代码ENOENT,这意味着“找不到文件”。这有点令人抓狂,因为该文件确实存在并且具有正确的权限。我用谷歌搜索了这个问题(通过搜索“execveenoen”)并在stackoverflow中找到了这个答案,它指出要运行二进制文件,您不仅需要二进制文件存在!您还需要它的加载程序存在。(加载程序的路径在二进制文件中)要查看加载程序的路径,您可以像这样使用ldd:$lddsqlite3linux-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是Ubuntu16.04,本文应使用18.04“BionicBeaver”)安装程序不支持32位二进制文??件一块(?),所以我需要尝试一些不同的东西。尝试2:安装Debiansqlite3包好吧,我想我可以从debian测试中安装sqlite包。尝试从我不使用的另一个Debian版本安装软件包不是一个好主意,但出于某种原因,我还是决定尝试一下。这次毫不奇怪地破坏了我计算机上的sqlite(也破坏了git),但我设法用sudodpkg--purge--force-alllibsqlite3-0恢复并使所有依赖sqlite的软件再次工作。尝试3:提取Debiansqlite3包我还尝试从Debiansqlite包中提取sqlite3二进制文件并运行它。毫不奇怪,这也不起作用,但这个更容易理解:我有一个旧版本的libreadline(.so.7),但它需要.so.8。$./usr/bin/sqlite3./usr/bin/sqlite3:加载共享库时出错:libreadline.so.8:无法打开共享对象文件:没有这样的文件或目录尝试4:从源代码编译我花了so原因我花了这么多时间尝试下载sqlite二进制文件,我认为从源代码编译sqlite既烦人又耗时。但显然,下载一个随机的sqlite二进制文件根本不适合我,所以我最终决定尝试自己编译它。这是一个指导:如何编译SQLite。这是宇宙中最简单的事情。通常,构建感觉是这样的:运行./configure意识到我缺少依赖项再次运行./configure运行make编译失败,因为我安装了错误版本的依赖项来做其他事情,然后找到编译SQLite的方法二进制文件如下:从下载页面下载集成的tarball运行gccshell.csqlite3.c-lpthread-ldl完成!!!所有代码都在一个文件(sqlite.c)中,并且没有奇怪的依赖关系!太奇妙了。就我而言,我并不真正需要线程支持或readline支持,所以我使用编译页面上的说明创建了一个非常简单的二进制文件,它只使用libc而没有其他共享库。$lddsqlite3linux-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的了解,这并不太令人惊讶(它在受限环境/嵌入式环境中工作得非常好,因此可以以非常简单/最小的方式编译它是有道理的)。但这太好了!