源码编译mysql-connector-cpp 1.1.x
前言
Windows下C++访问MySQL,一开始使用ODBC,但是觉着有点麻烦,局限性也挺大。举例来说,一些C++特性比如string使用起来很麻烦,还有编码问题,ODBC有一个编码设置,ODBC连接还有一个编码设置,如果任何一个不同,都会导致乱码;如果任何一个与数据库的编码不同,也会乱码。所以改为使用MySQL官方的mysql-connector-cpp。这里记录一下编译过程中遇到的问题
mysql-connector-cpp虽然提供了安装程序,但是需要重新编译,除非你使用的环境与官方编译的环境一样,不然就会有崩溃的问题。因为不同环境下编译的类库,在使用时,可能导致内存申请释放的bug。我遇到的就是string字符串在赋值过程中崩溃。
准备工作
- visual studio 2017
- boost_1_64_0
- mysql
- cmake
我们可以直接使用vs的cmake编译,但是一些报错提示和配置太麻烦了,所以建议现在安装官方的cmake程序,然后生成vs程序再编译
mysql-connector-cpp使用了boost库,所以需要下载boost库,官方文档说明了最低版本,下载比它高的就可以。除了编译的时候用,后续开发也需要引入boost库
这里需要安装的mysql,就是需要mysql中的头文件和类库,在编译过程中需要,这里还有一个问题,就是mysql安装的是32位还是64位,看下面注意事项
下载源码
https://dev.mysql.com/downloads/connector/cpp/
- 打开网页
- 选择Archives
- 在Product Version选择1.1.12,这个是1.1中最高的版本,建议用最新的,解决了一些老的bug。因为8.0.x的版本编译需要openssl,没有编译过去,并且原来项目也用的1.1.x,8.0的写法也发生了改变,所以还是编译使用1.1。
- 在Operation System选择Source Code
- 然后下载Windows (Architecture Independent), ZIP Archive
No CMAKE_C_COMPILER could be found.
这是由于没有安装Windows 8.1 SDK/UCRT SDK,安装上就可以
第一个错误是没指定boost目录
在CMake界面,Add Entry,然后填写BOOST_ROOT,选择value为path,然后选择下载的boost目录即可
第二个错误是没指定mysql的头文件目录
点击出错的配置,选择mysql安装目录下的include目录
第三个错误是没指定mysql的类库
点击出错的配置,选择mysql安装目录下的lib/libmysql.lib
然后再configure就可以了
configure完成后点击generate
generate完成后,打开工程,运行buil all
编译完成后,在drive目录下就有我们需要的类库
然后把这三个类库拷贝到我们自己工程目录下,在工程配置link,增加lib的地方加上mysqlcppconn.lib,并且在link,增加lib引用目录的地方填上对应的目录,这样就完成了,可以访问数据库了
注意事项
这里编译出来的lib库,d版本和r版本名称一样,可以自己改名称或是放到不同目录下,在我们自己工程引用的时候,d版本和r版本需要配置对应的类库,不能配置错了
在程序运行的时候,提示没有libmysql.dll,这个文件在mysql安装目录lib下,就是刚才引用类库的目录下。
如果我们的工程是32位,那么mysql-connector-cpp就必须编译32位的类库,那么cmake配置的时候就必须配置x86的,那么mysql就必须安装32位的(这个安装仅仅是为了获得编译和开发的时候需要的类库,与开发完成,服务器上实际访问的数据库没关系)。
如果我们的工程师64位,那么mysql-connector-cpp就必须编译64位类库,cmake需要配置x64工程,需要64位mysql的类库。
所以我们可以分别安装32位和64位mysql,然后把对应的include和lib拷贝出来单独用来编译。