找回密码
 立即注册
首页 业界区 业界 CMake构建学习笔记23-SQLite库的构建

CMake构建学习笔记23-SQLite库的构建

涣爹卮 昨天 21:18
1. 构建思路

在前文中构建了大量的库包程序(参看CMake构建学习笔记-目录)之后,可以总结一下在Windows下使用脚本构建程序的办法:

  • 使用CMake构建。这是目前最通用最流行的构建方式,大部分C/C++程序都在逐渐向这个方向转。
  • 使用namke构建。在CMake流行之前,有的程序会提供MSVC项目文件,这种情况下可以使用namke来进行构建。
  • 使用MSYS2/MinGW构建。适用于只提供了Linux环境构建方式的程序,不过可能会有二进制兼容问题,一般不推荐。
  • 使用第三方的项目构建。比如自己组织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.c、sqlite3.h、sqlite3ext.h是SQLite的源代码文件,不用进行修改。需要注意的是SQLite提供两种源代码文件,一种是分散组织的,一种是组合成单文件的,一定要选择后者才能看到sqlite.c文件(比如sqlite-amalgamation-3460000.zip)。
另外,sqlite3.def是模块定义文件,为Windows的DLL模块定义各种属性和导出符号。如果是像笔者一样需要构建成动态库,那么这个文件一定要有。这个文件可以在SQLite提供预编译包种找到(比如sqlite-dll-win-x64-3460000)。
最后,CMakeLists.txt中的内容如下:
  1. # 输出cmake版本提示
  2. message(STATUS "The CMAKE_VERSION is ${CMAKE_VERSION}.")
  3. # cmake的最低版本要求
  4. cmake_minimum_required (VERSION 3.10)
  5. # 工程名称、版本、语言
  6. project(sqlite3 VERSION 3.4.6)
  7. # 支持当前目录
  8. set(CMAKE_INCLUDE_CURRENT_DIR ON)
  9. # 判断编译器类型
  10. message("CMAKE_CXX_COMPILER_ID: ${CMAKE_CXX_COMPILER_ID}")
  11. # 判断编译器类型
  12. if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
  13.     message(">> using Clang")
  14. elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
  15.     message(">> using GCC")
  16. elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
  17.     message(">> using Intel C++")
  18. elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
  19.     message(">> using Visual Studio C++")          
  20.     add_compile_options(/utf-8)
  21. else()
  22.     message(">> unknow compiler.")
  23. endif()
  24. # 设置编译定义
  25. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} \
  26. -DSQLITE_THREADSAFE=1 \
  27. -DSQLITE_ENABLE_COLUMN_METADATA \
  28. -DSQLITE_ENABLE_PREUPDATE_HOOK \
  29. -DSQLITE_ENABLE_RTREE \
  30. -DSQLITE_ENABLE_GEOPOLY \
  31. -DSQLITE_ENABLE_SESSION \
  32. -DSQLITE_ENABLE_RBU")
  33. # 源代码文件
  34. set(INCLUDE_FILES
  35.     ./include/sqlite3.h
  36.     ./include/sqlite3ext.h
  37. )
  38. set(SOURCE_FILES
  39.     ./src/sqlite3.c
  40.     ${INCLUDE_FILES}
  41. )
  42. # 动态库前缀与后缀
  43. IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
  44.         set(LibraryPrefix lib)
  45.     set(LibraryPostfix so)
  46. ELSEIF(CMAKE_SYSTEM_NAME MATCHES "Windows")
  47.         set(LibraryPrefix )
  48.     set(LibraryPostfix lib)
  49. ENDIF()
  50. # 将源代码添加到此项目的可执行文件。
  51. add_library(${PROJECT_NAME} SHARED ${SOURCE_FILES})
  52. if(CMAKE_SYSTEM_NAME MATCHES "Windows")   
  53.     # 指定.def文件
  54.     set_target_properties(${PROJECT_NAME} PROPERTIES
  55.     OUTPUT_NAME ${PROJECT_NAME}
  56.     LINK_FLAGS "/DEF:${CMAKE_CURRENT_SOURCE_DIR}/sqlite3.def")
  57. endif()
  58. # TODO: 如有需要,请添加测试
  59. # 安装头文件到 include 目录
  60. install(DIRECTORY include/ DESTINATION include)
  61. # 安装库文件到 lib 目录
  62. install(TARGETS ${PROJECT_NAME}
  63.         LIBRARY DESTINATION lib  # 对于共享库
  64.         ARCHIVE DESTINATION lib  # 对于静态库
  65.         RUNTIME DESTINATION bin  # 对于可执行文件
  66. )
复制代码
然后执行如下脚本指令:
  1. cmake $SourceLocalPath `
  2.     -B "$BuildDir" `
  3.     -G "$Generator" `
  4.     -A x64 `
  5.     -DCMAKE_CONFIGURATION_TYPES=RelWithDebInfo `
  6.     -DCMAKE_INSTALL_PREFIX="$InstallDir"
  7. # 构建阶段,指定构建类型
  8. cmake --build $BuildDir --config RelWithDebInfo
  9. # 安装阶段,指定构建类型和安装目标
  10. cmake --build $BuildDir --config RelWithDebInfo --target install
复制代码
即可完成编译、链接到安装的完整构建过程。$SourceLocalPath是源代码目录,也就是前面的CMake项目文件夹;$BuildDir是构建目录文件夹;"$Generator"是生成器,比如Visual Studio 16 2019。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册