恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

CMake构建学习笔记-SpatiaLite库的构建

  • 首页
  • 资讯中心
  • /
  • CMake构建学习笔记-SpatiaLite库的构建

相关资讯

程序员写文档、查资料总被工具网址折腾?我用统一导航减少重复检索 2026/8/2 18:08:03
计算机毕业设计之基于SpringBoot的家庭服务管理系统的设计与实现 2026/8/2 18:08:03
如何一键永久保存全网小说?novel-downloader完整指南 2026/8/2 18:08:04

最新资讯

小型语言模型(SLM)技术解析与应用实践
BSP工程师如何转型嵌入式系统架构师
Playnite 启动参数 5 个实用技巧:让游戏库管理器启动更快、告别卡顿
口岸政务窗口双屏翻译机落地应用指南
LED点阵屏
5 分钟搭好 go2rtc:把摄像头变成低延迟 Web 直播的完整指南

今日推荐

MATLAB仿生优化框架:长鼻浣熊算法多策略融合实现
【JAVA毕设源码分享】基于 JavaWeb 的校园一卡通管理系统的设计与实现 基于 JavaWeb 的校园卡业务管理系统(程序+文档+代码讲解+一条龙定制)
【JAVA毕设源码分享】基于 Java 的图书馆借阅管理平台的搭建与实现 基于 Java 的图书馆综合管理系统(程序+文档+代码讲解+一条龙定制)

本周热门

超人会飞不算本事:系统稳定依赖清晰规则与边界设计
超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论
基于CNN的调制信号识别:MATLAB实现时频图分类实战

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

CMake构建学习笔记-SpatiaLite库的构建

发布时间:2026/9/12 21:07:45
CMake构建学习笔记-SpatiaLite库的构建 CMake构建学习笔记-SpatiaLite库的构建引言大家好我是你们的老朋友一个在代码世界里摸爬滚打多年的技术博主。今天我们要聊的是一个看似小众但实际非常强大的库——SpatiaLite。它就像SQLite的“地理信息系统GIS外挂”能让轻量级数据库处理空间数据比如经纬度、多边形、路线规划。而我们要做的就是用CMake这个“万能胶水”把它构建到我们的项目中。你可能会问“为什么不用现成的包管理器” 因为当你在嵌入式设备、老旧服务器或者需要定制编译参数时手动构建才是王道。CMake就像一个装修队长能帮我们把SpatiaLite的“砖块”源代码砌成可用的“房子”库文件。废话不多说我们直接开干## 准备工作了解SpatiaLite的“家谱”SpatiaLite本质上是一个SQLite的扩展库它依赖于几个基础库-SQLite3数据库核心-GEOS几何运算引擎比如判断两个多边形是否相交-Proj坐标转换器把北京54坐标转成WGS84-FreeXLExcel文件读取可选这些依赖就像做菜时的调料缺一味都不行。为了简化我们假设你已经在系统里安装了这些库Windows上可以用vcpkgLinux用aptmacOS用brew。如果没装可以先跑以下命令bash# Ubuntu/Debian示例sudo apt-get install libsqlite3-dev libgeos-dev libproj-dev libfreexl-dev## 第一步获取SpatiaLite源码去官网www.gaia-gis.it下载最新版或者直接git clone它的GitHub仓库。这里我用一个假设的版本号5.0.1为例bashgit clone https://github.com/OSGeo/libspatialite.gitcd libspatialitegit checkout tags/v5.0.1## 第二步用CMake构建——不慌不忙的“三步曲”CMake构建通常分三步配置、生成、编译。我们写一个完整的构建脚本让你能一键搞定。### 示例1基础构建脚本CMakeLists.txt假设你的项目结构如下my_project/├── CMakeLists.txt├── src/│ └── main.cpp└── libspatialite/ # 下载的源码在根目录创建CMakeLists.txtcmake# CMakeLists.txt - 构建SpatiaLite库并集成演示程序cmake_minimum_required(VERSION 3.16)project(SpatiaLiteDemo)# 设置C标准set(CMAKE_CXX_STANDARD 17)# 1. 添加外部的SpatiaLite源码作为子项目# 注意这里假设libspatialite目录下有它自己的CMakeLists.txtadd_subdirectory(libspatialite)# 2. 创建可执行文件add_executable(spatialite_demo src/main.cpp)# 3. 链接SpatiaLite库以及它的依赖target_link_libraries(spatialite_demo PRIVATE spatialite # 核心库 ${SQLITE3_LIBRARIES} # SQLite3 ${GEOS_LIBRARIES} # GEOS ${PROJ_LIBRARIES} # Proj)# 4. 添加头文件搜索路径target_include_directories(spatialite_demo PRIVATE ${SQLITE3_INCLUDE_DIRS} ${GEOS_INCLUDE_DIRS} ${PROJ_INCLUDE_DIRS})这个脚本就像给SpatiaLite库“登记户口”——告诉CMake它在哪需要什么邻居依赖库。注意add_subdirectory会触发libspatialite内部的构建逻辑前提是这个子目录有自己的CMakeLists.txt。### 示例2一个简单的测试程序main.cpp现在写一个验证程序创建一个空间表并插入一个点cpp// main.cpp - 测试SpatiaLite的空间数据功能#include stdio.h#include sqlite3.h#include spatialite.hint main() { sqlite3 *db; int rc; // 1. 初始化SpatiaLite spatialite_init(0); // 0表示不初始化日志 // 2. 打开内存数据库也可以换成文件路径 rc sqlite3_open(:memory:, db); if (rc ! SQLITE_OK) { fprintf(stderr, 无法打开数据库: %s\n, sqlite3_errmsg(db)); return 1; } // 3. 加载SpatiaLite扩展 sqlite3_enable_load_extension(db, 1); rc sqlite3_exec(db, SELECT load_extension(mod_spatialite);, NULL, NULL, NULL); if (rc ! SQLITE_OK) { fprintf(stderr, 加载扩展失败: %s\n, sqlite3_errmsg(db)); sqlite3_close(db); return 1; } // 4. 创建一个空间表WGS84坐标系 const char *sql CREATE TABLE cities ( id INTEGER PRIMARY KEY, name TEXT, geom GEOMETRY ); SELECT AddGeometryColumn(cities, geom, 4326, POINT, XY); SELECT CreateSpatialIndex(cities, geom); INSERT INTO cities (name, geom) VALUES (北京, GeomFromText(POINT(116.4 39.9), 4326)); SELECT AsText(geom) FROM cities;; rc sqlite3_exec(db, sql, NULL, NULL, NULL); if (rc ! SQLITE_OK) { fprintf(stderr, SQL执行错误: %s\n, sqlite3_errmsg(db)); } else { printf(空间数据插入成功\n); } // 5. 清理 sqlite3_close(db); spatialite_cleanup(); return 0;}这段代码做了几件事- 初始化SpatiaLite环境- 打开内存数据库比文件快适合测试- 加载扩展库mod_spatialite这就是SpatiaLite的真身- 创建一个带有空间列geom的表插入北京天安门的坐标点116.4°E, 39.9°N- 最后查询并输出几何对象的文本表示## 第三步构建与运行在项目根目录执行bashmkdir build cd buildcmake ..make # 或者 cmake --build ../spatialite_demo如果一切顺利你应该看到输出“空间数据插入成功” 如果没有别急先检查依赖库是否装全或者看CMake的报错信息——通常它会告诉你“找不到GEOS头文件”之类的。## 常见问题与调试技巧1.找不到库路径在CMake配置时添加-DCMAKE_PREFIX_PATH/path/to/libs2.链接错误确保SpatiaLite编译时启用了GEOS和Proj支持可以在源码的CMakeLists.txt里查看find_package命令3.运行时崩溃检查是否调用了spatialite_init()否则某些功能会触发段错误## 进阶定制构建选项SpatiaLite的CMake支持很多选项比如禁用Excel支持-DENABLE_FREEXLOFF或启用调试模式。你可以通过ccmake .或cmake-gui来可视化配置就像给软件装“开关”一样bashcmake .. -DENABLE_FREEXLOFF -DCMAKE_BUILD_TYPEDebug这样构建的库更小适合嵌入式场景。## 总结通过这篇笔记我们走完了从零到一构建SpatiaLite库的全过程。核心要点有三1.理解依赖关系SpatiaLite不是孤岛它需要SQLite3、GEOS、Proj等“兄弟库”的支持。2.CMake脚本化用add_subdirectory引入外部源码用target_link_libraries链接依赖就像搭积木一样清晰。3.验证驱动写一个简单的空间数据操作程序确保库能正常工作这是避免“玄学问题”的终极武器。CMake构建看似繁琐但一旦掌握你就能自由裁剪任何C/C库。下次遇到需要编译GDAL、OpenCV之类的复杂库不妨也用类似思路试试。记住代码世界没有魔法只有精心组织的依赖关系。动手试试吧你也能成为构建大师

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号