成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SQLite真的很容易編譯

系統 Linux
我使用 sqlite 運行網站上的所有查詢,并且我想在其中一個例子中使用窗口函數。但是我使用的是 Ubuntu 18.04 中的 sqlite 版本,它太舊了,不支持窗口函數。所以我需要升級 sqlite!

[[281308]]

上周,我一直在做一個 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,如下所示:

  1. $ ldd sqlite3
  2. linux-gate.so.1 (0xf7f9d000)
  3. libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xf7f70000)
  4. libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf7e6e000)
  5. libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xf7e4f000)
  6. libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7c73000)
  7. /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

  1. $ ./usr/bin/sqlite3
  2. ./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 而沒有其他共享庫。

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

這很好,因為它使體驗 sqlite 變得容易

我認為 SQLite 的構建過程如此簡單很酷,因為過去我很樂于編輯 sqlite 的源碼來了解其 B 樹的實現方式。

鑒于我對 SQLite 的了解,這并不令人感到意外(它在受限環境/嵌入式中確實可以很好地工作,因此可以以一種非常簡單/最小的方式進行編譯是有意義的)。 但這真是太好了! 

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2018-10-30 12:44:04

Linux系統內存

2013-04-08 15:39:15

程序員

2010-02-23 16:21:24

Python Win

2010-01-20 10:14:53

C++程序

2013-12-11 09:29:02

2014-10-24 10:10:33

UbuntuUbuntu 14.1

2010-03-17 14:50:06

智能交換機

2010-03-10 11:14:56

智能交換機

2022-11-02 08:55:43

Gofor 循環存儲

2010-08-30 10:37:04

云計算

2010-03-10 16:51:21

以太網交換機

2019-01-21 13:56:52

2016-11-15 09:43:56

大數據數據工程師

2018-07-09 08:35:45

Windows 10WindowsBug

2023-11-06 08:41:31

JavaScript應用程序

2019-03-20 13:15:29

Wi-Fi 6

2019-11-12 10:50:13

Spring BootstarterJava

2019-05-13 14:20:19

正則表達式JavaScript前端

2022-01-06 11:27:12

互聯網大廠校招生騰訊

2022-02-21 12:35:54

SpringBoot校驗開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99久久免费观看 | 99精品视频在线 | 日韩欧美二区 | www.天天操| 青青草综合 | 成年男女免费视频网站 | 天啪| 国产欧美精品一区 | 91中文 | 成人在线视频网 | 亚洲小说图片 | www.精品一区 | 在线色网| 丝袜美腿一区二区三区 | 亚洲一区二区在线播放 | 久久久国产一区 | 国产视频久久 | www.亚洲成人网 | 91精品国产91久久久久久吃药 | 久久精品二区 | 在线久草 | 国产精品一区二区三区在线播放 | 操人网 | 成人欧美一区二区三区白人 | 欧美激情久久久久久 | 成人激情视频免费在线观看 | 美日韩免费视频 | 免费久久99精品国产婷婷六月 | 国产一区二区三区在线 | 日韩色在线 | 在线视频99 | 欧美专区日韩专区 | 中文字幕欧美日韩 | 中文字幕久久精品 | 精品国产一区二区三区久久久蜜月 | gav成人免费播放视频 | 九九精品影院 | 日韩av一区二区在线观看 | 国产精品我不卡 | 美女视频黄的免费 | 亚洲最大成人综合 |