linux c++ sqlite_SQLite 真的很容易编译 | Linux 中国
上周,我一直在做一个 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 中国相关推荐
- 为什么建议大家使用 Linux 开发?真的很很很优雅!
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 编者荐语 Linux 开发不算简单,要求同学们掌握的知识广且复杂, ...
- Linux内核学习之路_1_编译Linux内核
1.准备工作 1.1 学习环境 1.2 下载Linux内核源码 1.3 解压Linux内核 1.4 目录结构介绍 1.2.2 Linux内核配置 1.1 学习环境 本系列教程使用的环境如下: 操作系统 ...
- Linux编辑firmware的文件,rk3328编译Linux固件
一.编译 Linux 固件 这一章将介绍编译 ROC-RK3328-CC Linux 固件的整个流程. 1.1 准备工作 Linux 固件在如下的环境中编译: Ubuntu 16.04 amd64 安 ...
- linux下qt的odbc库编译,linux qt QODBC连接sql server 驱动 有关问题 ,实在是没辙了
linux qt QODBC连接sql server 驱动 问题 ,实在是没辙了 程序在linux下,现在需要连接windows的sqlserver . db = QSqlDatabase::data ...
- linux 静态库 解包,libcurl编译linux静态库及使用总结(编译成功库下载)
#-------------------------------------------------------------------------- #source file #源文件,自动找所有. ...
- 安装debian总结以及编译linux内核
1. 安装debian 使用unetbootin(http://unetbootin.sourceforge.net/)来创建启动盘,并且下载debian的基本包. 将磁盘进行压缩操作,并且保留出一个 ...
- debian 编译linux内核源码,安装debian总结以及编译linux内核
1. 安装debian 使用unetbootin(http://unetbootin.sourceforge.net/)来创建启动盘,并且下载debian的基本包. 将磁盘进行压缩操作,并且保留出一个 ...
- linux服务器 32核,Intel换成AMD 32核锐龙 Linux之父体验很好
Torvalds提到,Intel的至强他之前也考虑过,但计算价格后发现,成本太高了,核心数翻番往往需要花费5倍的价格,AMD就厚道许多,价格便宜了一半多. 去年5月,Linux之父Linus Torv ...
- Ubuntu20.04编译Linux内核
Ubuntu20.04编译Linux内核 下载Linux源码 生成.config文件 编译Linux内核 下载Linux源码 Linux源码可以从Linux内核官网进行下载,如下图所示,我下载的是5. ...
最新文章
- smokeping部署安装
- hough变换直线检测_CV学习笔记(十五):直线检测
- MySQL prepare语句的SQL语法
- 文字识别:关键信息提取的3种探索方法
- UI下拉模板|提升下拉列表菜单体验设计的10技巧
- server2012 AD域 radius 802.1x认证
- HTML快速上手教程
- oracle 存储过程深入学习与应用
- Android twrp+adb 完美免费救砖 安装系统教程 亲测有效
- 华为p50预计售价鸿蒙是什么,华为p50预计售价多少_华为p50售价预估
- ibm+i+to+mysql_IBM 的数据库Informix 常用代语法
- 2020vue面试题汇总
- 15软件班安卓课程实训总结
- mysql计算同比和环比的区别_MySQL实践之同比环比
- MAC地址 单播,组播,广播
- 一个sql server2005分页的存储过程
- 安卓7.0核心破解示列
- Delphi Web应用开发B/S框架推荐:《Delphi Web前端开发教程——基于TMS WEB Core框架》
- Oracle课程-深入学习文档
- 状态管理的概念,都是纸老虎
热门文章
- 实验4-1-9 猜数字游戏 (15 分)
- 天梯—计算指数(C语言)
- Win10+VS2017+Ceres-Solver-1.13.0配置
- opencv之解决Module opencv_ovis disabled because OGRE3D was not found
- 广安a货翡翠,自贡a货翡翠
- LR:Code-29723 Error: Failed to deliver a p2p message from parent to child process, reason。。。
- zookeeper-大数据Week6-DAY1-1-Zookeeper
- Android view 小总结
- tomcat安装并设置开机启动
- 54. C# -- 泛型(Generic)