VS2019编译 ODB 开源项目以及示例程序运行详解
编译准备
ODB是一个开源、支持多平台、多数据库基于C++的ORM框架,可将C++类对象与数据库表映射,进行轻松的数据库查询和操作,编译使用时需要在官网下载三个库包括:odb-2.4.0-i686-windows、libodb-2.4.0、libodb-sqlite-2.4.0,作为学习还需要下载odb-examples-2.4.0。

配置ODB工具环境
odb-2.4.0-i686-windows类似与ODB的源码编译工具,ODB的框架需要将特定的数据结构文件(.hxx)编译成特定文件一个是三个,例如:person.hxx经过编译会生成person-odb.hxx、person-odb.ixx和``person-odb.cxx`,解压缩下载的zip包并配置到环境变量中即可,配置如下所示:

配置完成后可以在CMD控制台上进行验证:

编译ODB运行时库
libodb-2.4.0是在具体程序运行时所依赖的动态库,可以使用Visual Studio直接打开进行编译,本文使用VS2019为例。解压缩下载的zip包,双击其中的对应版本的.sln文件,VS2013或以上版本都选择libodb-vc12.sln即可,编译完成后生产bin、lib、bin64和lib64四个文件夹,前两个表示32位,后两个表示64位。

编译ODB驱动
ODB数据库的驱动编译依赖具体使用的数据库提供的运行时库,在使用使用ODB进行编程时也需要使用这些运行时库,以下使用SQLite数据库的编译作为例子。
Sqlite源码编译
在编译libodb-sqlite-2.4.0前需要先编译一下SQLite源码,生成相对应的lib文件后续会用到。在SQLite官网下载源码zip,下载的压缩包解压缩后得到四个文件,如下所示:

使用VS2019创建静态库项目,如下所示:

将SQLite源码都拷贝到创建的项目中,并删除其中项目创建后自动生成的源码文件,在VS工程文件中做相同修改,如下图所示:

右键点击项目->属性,对项目进行修改,包括如下几个部分:
-
配置
Debug,平台x64- 常规->输出目录->
$(SolutionDir)\bin64 - 常规->目录文件名->
$(ProjectName)d - C\C+±>预处理器->
SQLITE_ENABLE_UNLOCK_NOTIFY;
- 常规->输出目录->
-
配置
Debug,平台Win32-
常规->输出目录->
$(SolutionDir)\bin -
常规->目录文件名->
$(ProjectName)d -
C\C+±>预处理器->
SQLITE_ENABLE_UNLOCK_NOTIFY;
-
-
配置
Release,平台x64- 常规->输出目录->
$(SolutionDir)\bin64 - 目录文件名->
$(ProjectName) - C\C+±>预处理器->
SQLITE_ENABLE_UNLOCK_NOTIFY;
- 常规->输出目录->
-
配置
Release,平台Win32-
常规->输出目录->
$(SolutionDir)\bin -
目录文件名->
$(ProjectName) -
C\C+±>预处理器->
SQLITE_ENABLE_UNLOCK_NOTIFY;
-
配置完成后分别使用这四个不同模式编译SQLite静态库,生成内容如下如下:

libodb-sqlite-2.4.0编译
解压缩下载的libodb-sqlite-2.4.0.zip文件得到libodb-sqlite-2.4.0文件夹,双击其中的对应版本的.sln文件,VS2013或以上版本都选择libodb-sqlite-vc12即可。
在编译前还需要对项目的属性进行修改,在修改前建议将编译好的文件都拷贝到一起,根据之前的生成的动态库和静态库,整理目录如下:
-
ODB运行时库:
bin、lib、bin64、lib64和odb文件夹五个文件夹拷贝到libodb-sqlite-2.4.0文件夹的common_lib文件夹中(common_lib文件夹是自己创建的)。 -
SQLite静态库:
bin、bin64两个文件夹和sqlite3.h文件拷贝到libodb-sqlite-2.4.0文件夹的db_source文件夹中(db_source文件夹是自己创建的)。
拷贝完成后打开.sln后找到需要修改,右键点击项目->属性->C/C++->常规->附加包含目录、右键点击项目->属性->链接器->常规->附加库目录、右键点击项目->属性->链接器->输入->附加依赖项,具体配置如下:
-
配置
Debug,平台x64- 附加包含目录->
$(SolutionDir)\common_lib\;$(SolutionDir)\db_source\; - 附加库目录->
$(SolutionDir)\common_lib\lib64\;$(SolutionDir)\db_source\bin64\; - 附加依赖项->
sqlite3.lib改为sqlite3d.lib
- 附加包含目录->
-
配置
Debug,平台Win32-
附加包含目录->
$(SolutionDir)\common_lib\;$(SolutionDir)\db_source\; -
附加库目录->
$(SolutionDir)\common_lib\lib\;$(SolutionDir)\db_source\bin\; -
附加依赖项->
sqlite3.lib改为sqlite3d.lib
-
-
配置
Release,平台x64- 附加包含目录->
$(SolutionDir)\common_lib\;$(SolutionDir)\db_source\; - 附加库目录->
$(SolutionDir)\common_lib\lib64\;$(SolutionDir)\db_source\bin64\; - 附加依赖项->
不用修改
- 附加包含目录->
-
配置
Release,平台Win32-
附加包含目录->
$(SolutionDir)\common_lib\;$(SolutionDir)\db_source\; -
附加库目录->
$(SolutionDir)\common_lib\lib\;$(SolutionDir)\db_source\bin\; -
附加依赖项->
不用修改
-
配置完成后编译对应的四个版本源码同样得到bin、lib、bin64和lib64四个文件夹,前两个表示32位数据库驱动,后两个表示64位数据库驱动。至此准备工作均已完成。
运行实例程序
解压缩odb-examples-2.4.0.zip压缩包,其中是ODB官方的实例程序,对于不同的数据库有不同的.sln文件本文使用的是SQLite因此打开examples-sqlite-vc12.sln解决方案,以hello-sqlite-vc12示例项目为例,如下所示:

此时如果双击上图中的三个文件会显示文件不存在,这就是需要使用ODB工具进行编译,可以编译hello-sqlite-vc12整个项目就会生成文件。但在编译整个项目之前还是需要整合之前编译的文件以及修改项目属性。
ODB运行时库:bin、lib、bin64、lib64和odb文件夹五个文件夹拷贝到odb-examples-2.4.0文件夹的odb\common_lib文件夹中(odb\common_lib文件夹是自己创建的)。
ODB数据库驱动:bin、lib、bin64、lib64、odb四个文件夹和sqlite3.h文件拷贝到odb-examples-2.4.0文件夹的odb\db_lib\lib_sqlite文件夹中(odb\db_lib\lib_sqlite文件夹是自己创建的)。
拷贝完成后同样修改两个位置,右键点击项目->属性->C/C++->常规->附加包含目录、右键点击项目->属性->链接器->常规->附加库目录,具体配置如下:
-
配置
Debug,平台x64- 附加包含目录->
$(SolutionDir)\odb\common_lib\;$(SolutionDir)\odb\db_lib\lib_sqlite\; - 附加库目录->
$(SolutionDir)\odb\common_lib\lib64\;$(SolutionDir)\odb\db_lib\lib_sqlite\lib64\;
- 附加包含目录->
-
配置
Debug,平台Win32- 附加包含目录->
$(SolutionDir)\odb\common_lib\;$(SolutionDir)\odb\db_lib\lib_sqlite\; - 附加库目录->
$(SolutionDir)\odb\common_lib\lib\;$(SolutionDir)\odb\db_lib\lib_sqlite\lib\;
- 附加包含目录->
-
配置
Release,平台x64- 附加包含目录->
$(SolutionDir)\odb\common_lib\;$(SolutionDir)\odb\db_lib\lib_sqlite\; - 附加库目录->
$(SolutionDir)\odb\common_lib\lib64\;$(SolutionDir)\odb\db_lib\lib_sqlite\lib64\;
- 附加包含目录->
-
配置
Release,平台Win32- 附加包含目录->
$(SolutionDir)\odb\common_lib\;$(SolutionDir)\odb\db_lib\lib_sqlite\; - 附加库目录->
$(SolutionDir)\odb\common_lib\lib\;$(SolutionDir)\odb\db_lib\lib_sqlite\lib\;
- 附加包含目录->
配置好后进行编译会生成driver.exe。在运行前需要把对应版本的动态库都拷贝到driver.exe同级目录下,以debug为例需要拷贝obd\common_lib\bin64\odb-d-2.4-vc12.dll和odb\db_lib\lib_sqlite\odb-sqlite-d-2.4-vc12.dll。
ODB在创建DB对象时依赖参数配置,对于当前这个示例而言在运行时需要进行参数设置,右键点击项目->属性->调试->命令参数填写--database $(OutDir)\hello.db
