wxsqlite3-4.9.4的编译和使用

该文详细介绍了如何在Windows10上安装和编译wxWidgets库,以及如何设置环境变量。接着,它说明了下载和编译wxSqlite3的过程,包括修改预处理器定义以匹配NavicatforSQLite的加密方式。最后,文章提供了在项目中使用静态库的步骤,包括修改配置属性和解决链接错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

运行环境:
系统:Win10
IDE:Visual Studio 2022
wxsqlite3版本:wxsqlite3-4.9.4
wxWidgets 版本:wxWidgets-3.2.2.1

(1)下载wxWidgets,安装和编译
https://www.wxwidgets.org/downloads/

  • 下载完成后安装,安装到:D:\Program\wxWidgets
    进入D:\Program\wxWidgets\build\msw,根据你的VS版本打开对应的解决方案,比如若使用vs2022,则选择wx_vc17.sln,点击Visual Studio顶部的生成菜单–>批生成–>全选–>点击生成。
  • 这样在 D:\Program\wxWidgets\lib目录下生成vc_dll、vc_lib、vc_x64_dll、vc_x64_lib四个文件夹,每个文件夹的mswu\wx有一个setup.h。
    把文件夹名字vc后面加上对应你的vs的版本数字,vs2022对应14x。如果不修改,编译的时候找不到路径。

(2)设置环境变量
在环境变量里添加WXWIN变量,指向wxWidgets的安装目录。

  • 变量名:WXWIN
  • 变量值:D:\Program\wxWidgets

(3)下载wxSqlite3,并解压缩
https://github.com/utelle/wxsqlite3
解压缩到D:\Program\wxSqlite3

(4)编译wxSqlite3

  • 要事先按照上面(2)所示设置好环境变量WXWIN,下面的sln工程文件读取wx_setup.props进行编译参数的设置,根据$(WXWIN)变量来查找wxWidgets的安装目录,然后设置“附加包含目录”和“附加库目录”等。这样wxsqlite可以找到需要的头文件和库,不需要再在vc++包含目录和库目录中添加。
  • 进入build目录,用vs打开相应的工程文件。比如vs 2022,打开wxsqlite3_vc17.sln工程文件。打开工程文件后,不需要做什么,选择所需的方案比如Debug Dll Win64–x64和Debug Win64–x64进行编译即可。于是在D:\Download\wxSqlite3\lib目录下分别生成两个文件夹vc14x_x64_dll和vc14x_x64_lib,分别对应dll和lib文件。
  • 源码默认加密方式为chacha20,但navicat for
    sqlite中使用的是aes128。为了方便使用,可以改成和navicat一样。
    添加到预处理器下面定义:CODEC_TYPE=CODEC_TYPE_AES256

(5)静态库的使用

  • 拷贝wxsqlte3d.lib(如果是动态链接还要拷贝wxsqlite3d.dll)到工程目录。
  • 打开wxWidgets\include\msvc\wx下的setup.h文件,第91行:#define wxCOMPILER_PREFIX vc,修改为:
    #define wxCOMPILER_PREFIX vc14x。vc14x对应你的vs版本。
  • 项目 ->属性 ->配置属性 ->VC++目录 ->包含目录,添加:
    D:\Program\wxSqlite3\include
    D:\Program\wxWidgets\include
    D:\Program\wxWidgets\include\msvc
  • 项目 ->属性 ->配置属性 ->VC++目录 ->库目录,添加:D:\Program\wxWidgets\lib\vc14x_x64_lib
  • 项目属性 ->配置属性->C/C++ ->与编译器 ->预编译器定义,按照如下设置:
    NDEBUG
    _CONSOLE
  • 点击生成,即可生成exe文件。
  • 如果出现错误提示:warning LNK4099: 未找到 PDB“”(使用“wxsqlite3d.lib(wxsqlite3.obj)”或在“”中寻找);正在链接对象。
    项目属性 ->配置属性->链接器 ->调试 ->生成调试信息,修改为“否”。
#include "wx/wxsqlite3.h"
#include <iostream>
using namespace std;
#pragma comment(lib, "wxsqlite3d.lib")
int main() {
	wxSQLite3Database db;
	db.Open(wxS("data.db"), wxS("112233"));
	if (db.IsOpen()) {
		// 删除数据表
		wxString sqlDrop = wxT(R"""(
			DROP TABLE IF EXISTS user
			)""");
		db.ExecuteUpdate(sqlDrop);
		// 创建数据表
		wxString sqlCreate = wxT(R"""(
			CREATE TABLE IF NOT EXISTS user(
			id INTEGER,
			name VARCHAR(255),
			age INTEGER,
			address VARCHAR(50))
			)""");
		db.ExecuteUpdate(sqlCreate);
		auto insa = db.PrepareStatement(wxT("INSERT INTO user(id,name,age,address) VALUES(1,'111',55,'aaaaa')"));
		insa.ExecuteUpdate();

		// 修改
		auto stm = db.PrepareStatement(wxT("UPDATE user SET age = 30 WHERE id = ?"));
		stm.Bind(1, 1);
		stm.ExecuteUpdate();
		// 插入数据
		auto ins = db.PrepareStatement(wxT("INSERT INTO user(id,name,age,address) VALUES(5,'555',55,'bbb')"));
		ins.ExecuteUpdate();
		//int i = db.ExecuteUpdate(wxT("(INSERT INTO user(id,name,age,address) VALUES(4,'333',33,'bbb')"));
		//printf("i=%d", i);
		db.Close();	
	}
}

(6)特别说明

  • 上面代码中,使用:db.ExecuteUpdate(wxT(“(INSERT INTO user(id,name,age,address)
    VALUES(4,‘333’,33,‘pppp’)”)); 会出现abort()错误,无法插入数据,程序退出。而使用:
auto ins = db.PrepareStatement(wxT("INSERT INTO user(id,name,age,address) VALUES(5,'555',55,'ppp')"));
ins.ExecuteUpdate();

没有错误,成功插入数据。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值