前言
連接數據庫通常在Java中使用比較多,但是C/C++在Linux下操作數據庫也是比較重要的,很多時候都能用得到,在網上查了很多教程,大多寫的有些問題,通過自己摸索,終於成功的連接了MariaDB,記錄一下做個參考。
開發環境是阿里雲CentOS7 64位,使用yum安裝MariaDB,安裝教程看我另一篇文章:CentOS7安裝MariaDB及配置
安裝locate工具
部分版本的linux系統使用locate快速查找某文件路徑會報以下錯誤:
-bash: locate: command not found
其原因是沒有安裝mlocate這個包,安裝mlocate
yum -y install mlocate
安裝完再嘗試用locate定位內容,發現依然不好使,報了新的錯誤
locate: can not stat () `/var/lib/mlocate/mlocate.db': No such file or directory
原因是安裝完后沒有更新庫,更新庫
updatedb
安裝完成后,就可以使用locate快速查找某文件路徑
C++連接MariaDB
先看一個簡單的連接數據庫程序
#include <stdlib.h>
#include <stdio.h>
#include "mysql/mysql.h"
int main( int argc, char *argv[] )
{
MYSQL *conn_ptr;
conn_ptr = mysql_init( NULL ); /* 連接初始化 */
if ( !conn_ptr )
{
fprintf( stderr, "mysql_init failed\n" );
return(EXIT_FAILURE);
}
conn_ptr = mysql_real_connect( conn_ptr, "x.x.x.x", "root", "passwd", "dbname", 0, NULL, 0 ); /* 建立實際連接 */
/* 參數分別為:初始化的連接句柄指針,主機名(或者IP),用戶名,密碼,數據庫名,0,NULL,0)后面三個參數在默認安裝mysql>的情況下不用改 */
if ( conn_ptr ){
printf( "Connection success\n" );
}
else{
printf( "Connection failed\n" );
}
mysql_close( conn_ptr ); /* 關閉連接 */
return(EXIT_SUCCESS);
}
想要連接MySQL,必須先添加頭文件:#include <mysql/mysql.h>
然后在你的Makefile中加入-I/usr/include/mysql 和 -L/usr/lib64/mysql 和 -lmysqlclient
如果你遇到了其他錯誤,請看下最后的問題解決
例如:
CC=g++ #編譯器
CFLAGS=-g #可以使用gdb調試
BIN=MicroChatServer #生成的可執行目標文件名
OBJS=sysutil.o #.c/.cpp文件對應的.o目標文件
LIBS=-I/usr/include/mysql -L/usr/lib64/mysql -lmysqlclient -ljsoncpp -lpthread #鏈接庫
$(BIN):$(OBJS)
$(CC) $(CFLAGS) $^ -o $@
%.o:%.cpp
$(CC) $(CFLAGS) -c $< -o $@ $(LIBS)
.PHONY:clean #清理所有目標文件和可執行文件
clean:
rm -f *.o $(BIN)
然后make,就可以成功運行
問題解決
問題1:
connect1.c:4:19: 錯誤:mysql.h:沒有那個文件或目錄
提示是沒有找到mysql.h,產生這個錯誤的原因是沒有mysql.h文件,它在mysql-devel包中,需要安裝這個包:
sudo yum install mysql-devel -y
然后找一下:
# locate mysql.h
/usr/include/mysql/mysql.h
這樣就可以找到這個頭文件了(-I的含義是在指定位置搜索頭文件,參見man gcc)。
問題2:
再次嘗試編譯,出現了錯誤:
# gcc connect1.c -o connect1 -I/usr/include/mysql -lmysqlclient
/usr/bin/ld: cannot find -lmysqlclient
collect2: ld 返回 1
鏈接庫有問題,找不到mysqlclient鏈接庫,man gcc發現可以在后面用-L指定搜索位置,於是我們先找到mysqlclient庫的位置:
# locate *mysqlclient*
/usr/lib64/mysql/libmysqlclient.so
/usr/lib64/mysql/libmysqlclient.so.18
/usr/lib64/mysql/libmysqlclient.so.18.0.0
/usr/lib64/mysql/libmysqlclient_r.so
在這里要說明一下,有的系統在/usr/lib/mysql/下,但是本人使用的是CentOS7 64位的,就在/usr/lib64/mysql/下,這就是為什么要裝mlocate確定庫的位置了,因為很多博客文章並沒有說清楚,而是直接說在/usr/lib/mysql/下,導致一部分系統無法成功鏈接並報錯
在找到了位置后,就可以編譯了:
gcc connect1.c -o connect1 -I/usr/include/mysql -L/usr/lib64/mysql -lmysqlclient
編譯成功,於是就可以運行了,在此之前,確保mysqld已經在運行了:
sudo /etc/rc.d/init.d/mysqld restart
然后執行生成的可執行文件:
./connect1
Connection success
打印出了我們設計好了的連接成功的打印信息。這樣就成功通過C/C++語言連接了MySQL數據庫
