事实证明,这个过程超麻烦(如通常一样),但是非常有趣!-- Julia Evans

上周,我一直在做一个 SQL 网站(https://sql-steps.wizardzines.com/,一个 SQL 示例列表)。我使用 sqlite 运行网站上的所有查询,并且我想在其中一个例子(这个)中使用窗口函数。

但是我使用的是 Ubuntu 18.04 中的 sqlite 版本,它太旧了,不支持窗口函数。所以我需要升级 sqlite!

事实证明,这个过程超麻烦(如通常一样),但是非常有趣!我想起了一些有关可执行文件和共享库如何工作的信息,结论令人满意。所以我想在这里写下来。

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

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

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

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

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

要查看加载程序的路径,可以使用 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 位二进制文件(?),因此我需要尝试一些不同的东西。

尝试 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 的方式如下:

◈ 从下载页面下载整合的 tarball◈ 运行 gcc shell.c sqlite3.c -lpthread -ldl◈ 完成!!!

所有代码都在一个文件(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: https://jvns.ca/blog/2019/10/28/sqlite-is-really-easy-to-compile/

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

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

?:还在看吗?

linux c++ sqlite_SQLite 真的很容易编译 | Linux 中国相关推荐

  1. 为什么建议大家使用 Linux 开发?真的很很很优雅!

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 编者荐语 Linux 开发不算简单,要求同学们掌握的知识广且复杂, ...

  2. Linux内核学习之路_1_编译Linux内核

    1.准备工作 1.1 学习环境 1.2 下载Linux内核源码 1.3 解压Linux内核 1.4 目录结构介绍 1.2.2 Linux内核配置 1.1 学习环境 本系列教程使用的环境如下: 操作系统 ...

  3. Linux编辑firmware的文件,rk3328编译Linux固件

    一.编译 Linux 固件 这一章将介绍编译 ROC-RK3328-CC Linux 固件的整个流程. 1.1 准备工作 Linux 固件在如下的环境中编译: Ubuntu 16.04 amd64 安 ...

  4. linux下qt的odbc库编译,linux qt QODBC连接sql server 驱动 有关问题 ,实在是没辙了

    linux qt QODBC连接sql server 驱动 问题 ,实在是没辙了 程序在linux下,现在需要连接windows的sqlserver . db = QSqlDatabase::data ...

  5. linux 静态库 解包,libcurl编译linux静态库及使用总结(编译成功库下载)

    #-------------------------------------------------------------------------- #source file #源文件,自动找所有. ...

  6. 安装debian总结以及编译linux内核

    1. 安装debian 使用unetbootin(http://unetbootin.sourceforge.net/)来创建启动盘,并且下载debian的基本包. 将磁盘进行压缩操作,并且保留出一个 ...

  7. debian 编译linux内核源码,安装debian总结以及编译linux内核

    1. 安装debian 使用unetbootin(http://unetbootin.sourceforge.net/)来创建启动盘,并且下载debian的基本包. 将磁盘进行压缩操作,并且保留出一个 ...

  8. linux服务器 32核,Intel换成AMD 32核锐龙 Linux之父体验很好

    Torvalds提到,Intel的至强他之前也考虑过,但计算价格后发现,成本太高了,核心数翻番往往需要花费5倍的价格,AMD就厚道许多,价格便宜了一半多. 去年5月,Linux之父Linus Torv ...

  9. Ubuntu20.04编译Linux内核

    Ubuntu20.04编译Linux内核 下载Linux源码 生成.config文件 编译Linux内核 下载Linux源码 Linux源码可以从Linux内核官网进行下载,如下图所示,我下载的是5. ...

最新文章

  1. smokeping部署安装
  2. hough变换直线检测_CV学习笔记(十五):直线检测
  3. MySQL prepare语句的SQL语法
  4. 文字识别:关键信息提取的3种探索方法
  5. UI下拉模板|提升下拉列表菜单体验设计的10技巧
  6. server2012 AD域 radius 802.1x认证
  7. HTML快速上手教程
  8. oracle 存储过程深入学习与应用
  9. Android twrp+adb 完美免费救砖 安装系统教程 亲测有效
  10. 华为p50预计售价鸿蒙是什么,华为p50预计售价多少_华为p50售价预估
  11. ibm+i+to+mysql_IBM 的数据库Informix 常用代语法
  12. 2020vue面试题汇总
  13. 15软件班安卓课程实训总结
  14. mysql计算同比和环比的区别_MySQL实践之同比环比
  15. MAC地址 单播,组播,广播
  16. 一个sql server2005分页的存储过程
  17. 安卓7.0核心破解示列
  18. Delphi Web应用开发B/S框架推荐:《Delphi Web前端开发教程——基于TMS WEB Core框架》
  19. Oracle课程-深入学习文档
  20. 状态管理的概念,都是纸老虎

热门文章

  1. 实验4-1-9 猜数字游戏 (15 分)
  2. 天梯—计算指数(C语言)
  3. Win10+VS2017+Ceres-Solver-1.13.0配置
  4. opencv之解决Module opencv_ovis disabled because OGRE3D was not found
  5. 广安a货翡翠,自贡a货翡翠
  6. LR:Code-29723 Error: Failed to deliver a p2p message from parent to child process, reason。。。
  7. zookeeper-大数据Week6-DAY1-1-Zookeeper
  8. Android view 小总结
  9. tomcat安装并设置开机启动
  10. 54. C# -- 泛型(Generic)