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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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/ │ ├── …