目录
由于在使用c++编写算法,同时需要连接mysql数据库,开始时,我直接使用的c api来连接数据库,发现非常繁琐,于是开始使用connect c++ 来连接和访问数据库。
1 下载connector c++源码
确实可以直接下载connector c++的库直接使用,但是不推荐,因为直接用库,可能会由于系统原因导致莫名其妙的错误,我最开始就是直接下载的ubuntu 18.04的库,但是由于我的系统是19.10,但是官方并没有提供19.10的库,所以被迫使用18.04的库,刚开始能够正常使用,但是过了几天,就突然无法使用,报内存错误,特别坑,所以推荐使用源码,在系统上编译后,使用。
如果觉得下载慢,或者想为我贡献C币,可以下载这个:
如图,选择Source Code 以及对应系统。然后下载即可。
2 安装依赖文件
1. 编译工具Cmake
需要Cmake3.0以上
2. Mysql的Client Libary
就是mysql的 c api
3. boost C++ library
只有当你需要编译legacy JDBC才需要boost库,一般是不需要的,如果需要,得boost 1.59.0版本以上
4. openssl 库
需要1.0版本以上
#安装cmake
sudo apt-get install cmake
#安装mysql,现在是2020年,默认安装mysql8.0
sudo apt-get install mysql-client mysql-server
#安装mysql的c api
sudo apt-get install libmysqlclient-dev
# 安装openssl
sudo apt-get install openssl
# 安装boost
sudo apt-get install libboost-dev
3 编译
1. 创建build文件夹
在源码文件夹内创建一个build文件夹
2. 进入build文件夹,执行指令
cmake ../ -DCMAKE_BUILD_TYPE=Release -DWITH_JDBC=true
3. 编译
sudo make
sudo make install
4. 将编译后的文件放在正确的位置
用上述方法编译,并没有指定安装位置,所以会将编译得到的文件默认放在
/usr/local/mysql
路径下
进入connnector-c++ ,里面有
将include文件夹中的jdbc文件夹里面的所有文件(包括文件夹)复制到 /usr/local/include文件夹中
sudo cp -r include/jdbc/* /usr/local/include/
然后将lib64文件夹中的所有库,复制到 /usr/lib 目录下
sudo cp lib64/* /usr/lib/
至此,安装完毕,可以开始使用。
4 使用
#include <mysql_connection.h>
#include <mysql_driver.h>
#include <cppconn/driver.h>
using namespace sql;
using namespace std;
#define DBHOST "tcp://127.0.0.1:3306"
#define USER "root"
#define PASSWORD "123456"
int main(){
Driver *driver;
Connection *conn;
driver = get_driver_instance();
conn = driver->connect(DBHOST, USER, PASSWORD);
cout<<"DataBase connection autocommit mode = "<<conn->getAutoCommit()<<endl;
delete conn;
driver = NULL;
conn = NULL;
return 0;
}
使用
g++ mysqlconn.cpp -lmysqlcppconn
编译
5. 注意事项
一天后,我又在两台云服务器上进行了安装,但是中间都遇到了很多坑。一台是阿里云,安装的系统是centos7 所安装的软件非常地老旧,cmake只有2.8,需要自己下载源码,编译高版本的cmake。centos的安装命令与ubuntu不同,需要小心。另一台是天翼云的云服务器,使用的是ubuntu1604.这两台安装过程中,都遇到了一个坑,在我完成connector c++的编译之后,再去编译我编写的应用程序时,链接的时候报错:
意思是libmysqlcppconn动态库中有一个符号未定义,需要依赖其他库。刚遇到这个错误的时候我是茫然无知的,对这个错误进行了 大量的搜索,都没找到有用的信息,搞了一个上午。后来终于找到一个方法:
给编译器 g++ 加一个选项:
g++ ... -Wl,-allow-shlib-undefined
这个选项的意思是,允许动态库中有未定义的符号。加了之后,我的就能正常使用了,至于对使用有没有什么影响,我暂时没发现。
最后,需要说一下,同志们,保护好自己的头发。