CMake構建學習筆記23-SQLite庫的構建

1. 構建思路

在前文中構建了大量的庫包程序(參看CMake構建學習筆記-目錄)之后,可以總結一下在Windows下使用腳本構建程序的辦法:

  1. 使用CMake構建。這是目前最通用最流行的構建方式,大部分C/C++程序都在逐漸向這個方向轉。
  2. 使用namke構建。在CMake流行之前,有的程序會提供MSVC項目文件,這種情況下可以使用namke來進行構建。
  3. 使用MSYS2/MinGW構建。適用于只提供了Linux環境構建方式的程序,不過可能會有二進制兼容問題,一般不推薦。
  4. 使用第三方的項目構建。比如自己組織CMake項目,或者使用vcpkg這樣的庫包管理工具直接安裝。

2. 構建SQLite

SQLite是一個輕量級的、無需獨立服務器進程的嵌入式關系型數據庫。它將整個數據庫(包括表、索引和數據)存儲在一個單一的磁盤文件中,支持標準的SQL語法,廣泛用于嵌入式設備、移動應用和小型Web項目。SQLite是一個老牌的C庫,不提供CMake的構建方式,而且它還是個可執行程序而不僅僅是庫,這給程序的集成帶來一定的麻煩。

那么如何在Windows下將SQLite構建成庫文件呢?這里選擇第4種方案,根據源代碼文件生成CMake項目。SQLite提供了一個很不錯的特性,就是支持將所有的實現代碼組合成一個sqlite.c文件,因此自己組織CMake項目就比較簡單,組織結構如下:

project-root/
├── include/
│ ├── sqlite3.h
│ └── sqlite3ext.h
├── src/
│ └── sqlite3.c
├── CMakeLists.txt
├── CMakePresets.json
└── sqlite3.def

源代碼sqlite.csqlite3.hsqlite3ext.h是SQLite的源代碼文件,不用進行修改。需要注意的是SQLite提供兩種源代碼文件,一種是分散組織的,一種是組合成單文件的,一定要選擇后者才能看到sqlite.c文件(比如sqlite-amalgamation-3460000.zip)。

另外,sqlite3.def是模塊定義文件,為Windows的DLL模塊定義各種屬性和導出符號。如果是像筆者一樣需要構建成動態庫,那么這個文件一定要有。這個文件可以在SQLite提供預編譯包種找到(比如sqlite-dll-win-x64-3460000)。

最后,CMakeLists.txt中的內容如下:

# 輸出cmake版本提示
message(STATUS "The CMAKE_VERSION is ${CMAKE_VERSION}.")# cmake的最低版本要求
cmake_minimum_required (VERSION 3.10)# 工程名稱、版本、語言
project(sqlite3 VERSION 3.4.6)# 支持當前目錄
set(CMAKE_INCLUDE_CURRENT_DIR ON)# 判斷編譯器類型
message("CMAKE_CXX_COMPILER_ID: ${CMAKE_CXX_COMPILER_ID}")# 判斷編譯器類型
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")message(">> using Clang")
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")message(">> using GCC")
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")message(">> using Intel C++")
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")message(">> using Visual Studio C++")	  add_compile_options(/utf-8)
else()message(">> unknow compiler.")
endif()# 設置編譯定義
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} \
-DSQLITE_THREADSAFE=1 \
-DSQLITE_ENABLE_COLUMN_METADATA \
-DSQLITE_ENABLE_PREUPDATE_HOOK \
-DSQLITE_ENABLE_RTREE \
-DSQLITE_ENABLE_GEOPOLY \
-DSQLITE_ENABLE_SESSION \
-DSQLITE_ENABLE_RBU")# 源代碼文件
set(INCLUDE_FILES ./include/sqlite3.h./include/sqlite3ext.h
)
set(SOURCE_FILES./src/sqlite3.c${INCLUDE_FILES}
)# 動態庫前綴與后綴
IF(CMAKE_SYSTEM_NAME MATCHES "Linux")set(LibraryPrefix lib)set(LibraryPostfix so)
ELSEIF(CMAKE_SYSTEM_NAME MATCHES "Windows")set(LibraryPrefix )set(LibraryPostfix lib)
ENDIF()# 將源代碼添加到此項目的可執行文件。
add_library(${PROJECT_NAME} SHARED ${SOURCE_FILES})if(CMAKE_SYSTEM_NAME MATCHES "Windows")   # 指定.def文件set_target_properties(${PROJECT_NAME} PROPERTIESOUTPUT_NAME ${PROJECT_NAME}LINK_FLAGS "/DEF:${CMAKE_CURRENT_SOURCE_DIR}/sqlite3.def")
endif()# TODO: 如有需要,請添加測試# 安裝頭文件到 include 目錄
install(DIRECTORY include/ DESTINATION include)# 安裝庫文件到 lib 目錄
install(TARGETS ${PROJECT_NAME}LIBRARY DESTINATION lib  # 對于共享庫ARCHIVE DESTINATION lib  # 對于靜態庫RUNTIME DESTINATION bin  # 對于可執行文件
)

然后執行如下腳本指令:

cmake $SourceLocalPath `-B "$BuildDir" `-G "$Generator" `-A x64 `-DCMAKE_CONFIGURATION_TYPES=RelWithDebInfo `-DCMAKE_INSTALL_PREFIX="$InstallDir"# 構建階段,指定構建類型
cmake --build $BuildDir --config RelWithDebInfo# 安裝階段,指定構建類型和安裝目標
cmake --build $BuildDir --config RelWithDebInfo --target install

即可完成編譯、鏈接到安裝的完整構建過程。$SourceLocalPath是源代碼目錄,也就是前面的CMake項目文件夾;$BuildDir是構建目錄文件夾;"$Generator"是生成器,比如Visual Studio 16 2019

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/95196.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/95196.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/95196.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Watt Toolkit下載安裝并加速GitHub

一、下載 官方地址:(Steam++官網) - Watt Toolkit Gitee下載地址:https://gitee.com/rmbgame/SteamTools/releases/tag/3.0.0-rc.16

DevOps運維與開發一體化及Kubernetes運維核心詳解

前言: 在云原生時代,技術的融合與流程的重構已成為驅動業務創新的核心引擎。Kubernetes作為容器編排的事實標準,其穩定的運維能力是業務應用的基石;而DevOps所倡導的開發與運維一體化文化,則是實現快速交付和價值流動的…

HQX SELinux 權限問題分析與解決

Google自Android 5.0起強制實施的SELinux安全子系統,通過最小權限原則顯著提升了系統安全性,但這也導致開發過程中頻繁出現權限拒絕問題。值得注意的是,即便設備已獲取root權限,SELinux的強制訪問控制機制仍會限制部分敏感操作。 …

SpringBoot集成Kafka實戰應用

目錄 使用Kafka-Client實現消息收發 引入依賴 發送端: 消費端: SpringBoot集成 引入maven依賴 消費端 在上一篇我們深度解析了Kafka的運行操作原理以及集群消息消費機制等,請點擊下方鏈接獲取 Kafka消息隊列深度解析與實戰指南 本篇我…

單元測試總結2

1、重載和重寫的區別01、定義不同:重載是在同一個類中定義多個方法名相同但參數列表不同的方法;重寫是子類對父類中同名同參數列表的方法進行重新實現02、范圍不同:重載發生在同一個類中,重寫發生在子類和父類中03、參數要求不同&…

Wi-Fi技術——MAC特性

有線和無線網絡在數據鏈路層的特性存在差異,具體為: CSMA/CD 用于有線網絡,通過檢測和處理沖突來維持網絡的穩定性。CSMA/CA 用于無線網絡,強調沖突的預防,以應對無線信道共享的挑戰 1 有線網 CSMA/CD 有線網 CSMA/…

OpenHarmony 分布式感知中樞深度拆解:MSDP 框架從 0 到 1 的實戰指南

MSDP設備狀態感知框架技術開發文檔 1. 系統概述 1.1 框架定位 MSDP (Multi-Sensor Data Processing) 設備狀態感知框架是OpenHarmony系統中負責設備狀態識別和分發的核心服務,基于多傳感器融合技術,為系統應用提供設備狀態感知能力。 1.2 核心功能 靜止狀態識別:基于加速…

圖像 OSD層數據 顯示--OSD LOGO單色黑色顯示,按區域大小申請MMZ內存的優缺點分析

在監控攝像機、嵌入式顯示設備等場景中,OSD(On-Screen Display,屏幕顯示)LOGO 常需單色黑色顯示,且按區域大小申請 MMZ(Multi-Media Zone,多媒體專用內存)內存,該方案的優缺點需結合硬件資源、顯示效率、功能適配性等維度綜合分析,具體如下: 一、核心優勢:針對性優…

徐真妍最新雜志封面大片曝光,探索鏡頭下的多面魅力

近日,青年演員徐真妍拍攝的一組大片正式曝光。這組以 “森林系” 為主題的大片,登上時尚雜志《慵懶LAZY DAYS》8-9月刊封面。融合了優雅與現代先鋒感,展現了徐真妍甜美溫婉的表現力。鏡頭前的她,在多種風格間自如切換,…

廣度優先搜索(BFS, Breadth-First Search)

好的,我給你講 廣度優先搜索(BFS, Breadth-First Search),并配一個直觀例子。1?? 什么是廣度優先廣度優先搜索的特點:按層訪問:先訪問根節點,然后訪問它的直接子節點,再訪問子節點…

GD32入門到實戰22--紅外NEC通信協議

ir_drv.c紅外傳輸協議地位在前&#xff0c;所以我們可以這樣保存數據到數組假使接收到1就>>1再|0x80&#xff0c;如果接收到0就>>1新建紅外驅動層代碼ir_drv.c#include <stdio.h> #include "gd32f30x.h" #include <stdbool.h> static voi…

zkML-JOLT——更快的ZK隱私機器學習:Sumcheck +Lookup

1. 引言 ICME團隊開源的zkML項目&#xff1a; https://github.com/ICME-Lab/jolt-atlas&#xff08;Rust&#xff09; zkML-JOLT&#xff08;JOLT ‘Atlas’&#xff09;構建在a16z Crypto團隊的JOLT研究和實現基礎上&#xff0c;其性能比其他zkML項目快了3到7倍。 a16z Cr…

【大模型記憶-Mem0詳解-2】系統架構

概述 Mem0 實現了雙架構系統&#xff0c;通過兩種主要部署模型為 AI 應用提供智能內存能力&#xff1a; 托管平臺 &#xff1a;通過 MemoryClient 和 AsyncMemoryClient 類訪問的托管服務開源 &#xff1a;以 Memory 類為中心的自托管組件&#xff0c;具有可插拔提供程序 此架構…

[Java]PTA:jmu-Java-01入門-取數字浮點數

本題目要求讀入若干以回車結束的字符串表示的整數或者浮點數&#xff0c;然后將每個數中的所有數字全部加總求和。輸入格式:每行一個整數或者浮點數。保證在浮點數范圍內。輸出格式:整數或者浮點數中的數字之和。題目保證和在整型范圍內。輸入樣例:-123.01 234輸出樣例:7 9代碼…

FFmpeg音視頻處理解決方案

核心組件&#xff1a; ffmpeg&#xff1a;主要的命令行工具&#xff0c;用于轉碼、轉換格式等 ffprobe&#xff1a;用于分析多媒體文件信息的工具 ffplay&#xff1a;簡單的媒體播放器 主要功能&#xff1a; ? 格式轉換&#xff08;轉碼&#xff09; ? 視頻裁剪、合并 ? 調整…

機器學習回顧——決策樹詳解

決策樹基礎概念與應用詳解1. 決策樹基礎概念1.1 什么是決策樹決策樹是一種樹形結構的預測模型&#xff0c;其核心思想是通過一系列規則對數據進行遞歸劃分。它模擬人類決策過程&#xff0c;廣泛應用于分類和回歸任務。具體結構包括&#xff1a;內部節點&#xff1a;表示對某個特…

Linux開發必備:yum/vim/gcc/make全攻略

目錄 1.學習yum、apt?具&#xff0c;進?軟件安裝 1-1 什么是軟件包 1-2 yum/apt具體操作 2. 編輯器Vim 2-1 Linux編輯器-vim的引入 2-2 vim的基本概念 2-3 vim的基本操作 2-4 vim正常模式命令集 2-5 vim末?模式命令集 3. 編譯器gcc/g 3-1 背景知識 3-2 gcc編譯選…

【Linux系統】萬字解析,進程間的信號

前言&#xff1a; 上文我們講到了&#xff0c;進程間通信的命名管道與共享內存&#xff1a;【Linux系統】命名管道與共享內存-CSDN博客?????? 本文我們來講一講&#xff0c;進程的信號問題 點個關注&#xff01; 信號概念 信號是OS發送給進程的異步機制&#xff01;所謂異…

AI時代SEO關鍵詞實戰解析

內容概要 隨著人工智能技術深度融入搜索引擎的運行機制&#xff0c;傳統的SEO關鍵詞研究方法正經歷著根本性的變革。本文聚焦于AI時代背景下&#xff0c;如何利用智能化的策略精準定位目標用戶&#xff0c;實現搜索可見度的實質性躍升。我們將深入探討AI技術如何革新關鍵詞研究…

Spring Boot + Spring MVC 項目結構

下面一個既能返回 JSP 頁面&#xff0c;又能提供 JSON API 的 Spring Boot Spring MVC 項目結構&#xff0c;這樣你就能同時用到 Controller 和 RestController 的優勢。 &#x1f3d7; 項目結構 springboot-mvc-mixed/ ├── src/main/java/com/example/demo/ │ ├── …