本文以MySQL数据库为例,其他数据库类似,只需要下载对应的数据库的包即可。
第一步,准备资源包
本文中下载的代码可以在odb官网下载,地址为:https://www.codesynthesis.com/products/odb/download.xhtml
官网下载时,是没有mysql数据库的头文件和链接库的,需要自行另外下载。
需要下载的资源如下图所示:
也可以在CSDN上下载我已经打包好的资源文件,这个文件包中包含了mysql头文件和库文件,有32位和64位,地址为:
https://download.csdn.net/download/youyicc/12399765
资源文件目录如下:
第二步,编译libodb2.4
解压libodb-2.4.0.zip,解压后,里面自带了VS很多版本的.sln文件,最高的支持到VS2013,不过可以直接用高版本的VS打开。资源目录如下所示:
用VS2019直接打开,升级到最新的SDK,直接右键编译,这个项目编译不依赖其他库,所以直接编译即可,有一些警告信息,可以不用管它,输出结果如下:
生成的库文件如下所示:
这里是生成的32位的debug版本的,release版本和64位版本直接生成即可。
第三步,编译libodb-mysql-2.4
直接解压libodb-mysql-2.4.0.zip文件夹,解压后资源目录如下所示:
用VS2019打开libodb-mysql-vc12.sln,升级到最新SDK,此时,如果直接编译,会提示很多错误,如下图所示:
这里其实是因为odb的头文件没有找到,所以需要将上一个解压的文件夹中的odb的头文件和链接库复制过来,如下图所示,复制libodb-2.4.0文件夹中的lib文件夹和odb文件夹:
直接替换libodb-mysql-2.4.0文件夹中的lib文件夹和odb文件夹,如下所示:
再次编译,发现还是提示无法打开“odb/pre.hxx”等错误,如下所示:
右键项目,点击属性,在“VC++ 目录”中,选择包含库目录,根据需要输入odb文件夹的相对路径,例如:
再次编译,发现odb头文件找不到的问题,已经不存在了,现在提示mysql的头文件找不到,如下图所示:
此时,解压mysql.zip,目录结构如下所示:
将include文件夹复制到libodb-mysql-2.4.0文件夹中,如下所示:
再次打开项目属性,在“C++ 目录”中添加mysql的路径,配置如下所示:
最后再编译,最后发现提示“无法打开odb-d.lib”。
因为先前已经将上一步生成的lib文件夹复制了过来,这边只是没有找到库的路径,所以在项目属性中,打开“C++ 目录”中添加“库目录”,如下所示:
再次编译,提示“无法打开文件libmysql.lib”文件,这个文件就是mysql的链接库。在mysql文件夹中,将lib32文件夹中的“libmysql.lib”复制到“libodb-mysql-2.4.0/lib”中, 如下所示:
最后编译完成,如下所示:
生成的库目录如下所示:
注:releae的编译方法类似,64位编译时复制对应的lib64文件夹到lib64文件夹即可。
第三步,编译odb-examples-2.4
解压odb-examples-2.4.0.zip文件,目录如下所示:
用VS2019打开examples-mysql-vc12.sln文件,升级到最新的SDK库,默认“c++11-mysql-vc12”是启动项,这里不用修改,如果用VS2008之类的不支持C++11的编译器打开,则编译“hello-mysql-vc12”,项目配置过程都是相同的。
这里编译的时候,会提示一个错误,如下所示:
这个问题纠结了很久,最后才知道,是编译器在编译之前,会自动将employee.hxx文件通过odb.exe编译成sql文件和对应的C++类。要编译employee.hxx,需要先将odb-2.4.0-i686-windows.zip解压出来,目录如下所示:
在bin文件夹中,就有odb.exe文件。 这里有两种方法可以处理这个问题。
第一种,将employee.hxx复制到odb.exe同级目录中, 如下所示:
打开cmd窗口,跳转到odb.exe所在的目录,执行下面命令:
odb -d <database> --std c++11 --generate-schema --generate-query employee.hxx
这里database换成mysql即可,这里会生成几个文件,如下所示:
将生成的文件复制到odb-examples-2.4.0\c++11目录下即可,不推荐这种方式,因为每次重新编译都需要这样编译,挺麻烦的。
第二种,将odb.exe配置到环境变量中。首先将odb-2.4.0-i686-windows复制到系统资源盘(看
各人需要,我是放在D盘的),目录如下所示:
打开系统环境变量,在系统环境变量的Path中,增加odb.exe的完整目录,如下所示:
打开cmd窗口,输入odb --version回车,出现下面的界面表示配置成功,否则重启电脑试试:
配置好之后,在VS中编译时,会自动调用odb编译employee.hxx文件。
这里直接编译,也会提示错误:无法打开 源 文件“odb/database.hxx”,如下所示:
这里将上一步libodb-mysql-2.4.0文件夹中的“odb”文件夹和“lib”文件文件夹复制到“odb-examples-2.4.0\c++11”中, 如下所示:
右键“c++11-mysql-vc12”,打开属性对话框,在“VC++ 目录”中,添加odb和lib,如下所示:
编译的时候,会提示mysql相关的头文件不能打开,如下所示:
同样将mysql文件夹中的include文件夹复制到“odb-examples-2.4.0\c++11”中, 如下所示:
右键“c++11-mysql-vc12”,打开属性对话框,在“VC++ 目录”中,添加mysql的路径,如下所示:
再次编译,提示“无法打开文件 odb-mysql-d.lib”,此时将上一步libodb-mysql-2.4.0文件夹中生成的lib文件夹复制到odb-examples-2.4.0\c++11\lib即可,目录如下:
这里需要右键“c++11-mysql-vc12”,打开属性对话框,在“VC++ 目录”中,添加库目录的路径,如下所示:
最后编译成功,如下所示:
因为工程中,需要的链接库,都已经配置好,所以只需要将链接库的目录配置好即可。
第四步,生成数据库表
在第三步中,已经生成了employee.sql文件,在mysql管理工具中,将表生成出来,这里用的是Mavicat for MySQL工具。
生成的表结构如下所示:
最后一步,修改数据库连接代码
发现源代码中,是通过启动时传递argc和argv方式传递数据库连接信息,不方便调试,所以可以直接修改这部分代码。
源代码如下:
unique_ptr<database> db (create_database (argc, argv));
直接改成
unique_ptr<database> db(
new odb::mysql::database(
"root" // 数据库登录名
, "123456" // 数据库登录密码
, "mysqltest" // 数据库名称
, "127.0.0.1" // 数据库连接地址
, 3306 // 数据库连接端口
));
编译完成后,运行生成的exe,会提示找不到odb-mysql-d等一系列动态链接库,只需要将上面步骤中生成的.dll文件和mysql中对应的.dll文件复制到exe同级目录即可。
运行结果如下:
数据库中已经有数据了,如下所示: