CentOS7下使用C/C++連接MariaDB/MySQL


前言

連接數據庫通常在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數據庫


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM