目錄
由於在使用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
這個選項的意思是,允許動態庫中有未定義的符號。加了之後,我的就能正常使用了,至於對使用有沒有什麼影響,我暫時沒發現。
最後,需要說一下,同志們,保護好自己的頭髮。