sqlite3 vs2022下编译成动态库、静态库及编译x64 x86遇到问题的解决

  • 1、下载文件
  • 2、vs中创建编译工程
  • 3、编译x64、x86遇到的通用问题点及解决方式
  • 4、编译x86 Release版遇到的问题点及解决方式

1.下载文件
https://www.sqlite.org/download.html 下载sqlite-amalgamation 和 sqlite-dll-win64-x64 (x86版本不需下载,所需的.def文件和x64版本中的一样
此次编译(2025年7月)下载版本是3500200

解压后只需以下文件(非全部)
+---sqlite-amalgamation 中
| sqlite3.c
| sqlite3.h
| sqlite3ext.h

+---sqlite-dll-win64-x64
| sqlite3.def

2、vs中创建编译工程
vs中创建DLL新工程,将自动添加的文件全部移除。然后上面四个文件
sqlite3.c
sqlite3.h
sqlite3ext.h
sqlite3.def
添加到工程中
工程

其中,修改模块定义文件sqlite3.def

在最后追加sqlite3_unlock_notify
image

编译动态库、静态库的区别

【项目属性-配置类型】中,根据需求,如下图进行设置。
image

3、编译x64、x86遇到的通用问题点及解决方式(后续版本也兼容)
直接编译的话,会报错。会遇到以下问题。
① 预编译头文件【pch.h或者stdafx.h】缺失报错的问题。直接设置【项目属性-C/C++-预编译头-不使用预编译头】即可。
编译问题-x86-1-解决

② 新版本及后续版本这样处理也兼容.
先说解决方式:在【项目属性-C/C++-预处理器-预处理器定义】添加上
SQLITE_CORE
SQLITE_EXPORTS
SQLITE_ENABLE_FTS3
SQLITE_ENABLE_FTS5
SQLITE_ENABLE_RTREE
SQLITE_ENABLE_COLUMN_METADATA
SQLITE_ENABLE_SESSION
SQLITE_ENABLE_PREUPDATE_HOOK
SQLITE_ENABLE_DESERIALIZE
SQLITE_ENABLE_UNLOCK_NOTIFY
SQLITE_ENABLE_RBU

一堆LK2001:无法解析的的外部符号


1>sqlite3.def : error LNK2001: 无法解析的外部符号 sqlite3_column_database_name
1>sqlite3.def : error LNK2001: 无法解析的外部符号 sqlite3_column_database_name16
**
1>sqlite3.def : error LNK2001: 无法解析的外部符号 sqlite3_deserialize
1>sqlite3.def : error LNK2001: 无法解析的外部符号 sqlite3_fts3_may_be_corrupt
1>sqlite3.def : error LNK2001: 无法解析的外部符号 sqlite3_fts5_may_be_corrupt
编译问题-x86-2


原因
.def文件中导出了函数,但是,sqlite3.c源码文件中,因项目属性设置的关系,对应的函数代码没启用。
因此只需根据报错的API函数名,查看对应所需模块的预定义,把它们添加到属性中即可。
就以其中的RBU模块为例,在【项目属性-C/C++-预处理器-预处理器定义】添加上下图源码中判断的定义【SQLITE_ENABLE_RBU】
一堆模块未启用
编译问题-x86-2
预定义未声明,相应代码未启用。
编译问题1
声明预定义
编译问题-解决
编译成功
编译问题-解决1

4、编译x86 Release版遇到的问题点及解决方式
在编译DEBUG版本时正常。但是,编译x86 Release版时。编译器崩溃了。
解决:【项目属性-C/C++-优化-使大小最小化(/O1)】
经查资料,原因:SQLite 的 sqlite3.c 文件非常大,且包含大量宏定义和条件编译。默认启用优化 (/O2) 可能会导致编译器栈溢出。
同时,测试出(/O2及/Ox)均会崩溃。索性只用/O1 解决。
image

最后剩余的警告,不影响使用,先忽略,待后续再排查。
image

posted @ 2025-07-11 17:19  mars0906  阅读(320)  评论(0)    收藏  举报