• 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
    " );
    		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
    " );
    	}
    	else{
    		printf( "Connection failed
    " );
    	}
    
    	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数据库

  • 相关阅读:
    python 数据可视化(一)
    python unittest自动测试框架
    使用selenium抓取淘宝信息并存储mongodb
    python之re模块(正则表达式)
    [原] OpenGL ES 学习笔记 (二)
    [原] OpenGL ES 学习笔记 (一)
    [转] iOS开发同学的arm64汇编入门
    [转]ARM64 汇编
    [转]iOS高级调试&逆向技术-汇编寄存器调用
    [转] CGTime CMTimeRange CMTimeMapping 小结
  • 原文地址:https://www.cnblogs.com/WindSun/p/12142653.html
Copyright © 2020-2023  润新知