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数据库
CentOS7下使用C/C++连接MariaDB/MySQL的更多相关文章
- 解决Centos7 下 root账号 远程连接FTP,vsftpd 提示 530 Login incorrect 问题
原文:解决Centos7 下 root账号 远程连接FTP,vsftpd 提示 530 Login incorrect 问题 三步走: 1.vim /etc/vsftpd/user_list 注释掉 ...
- 【转帖】解决远程连接MariaDB(mysql)很慢的方法
在CentOS7上安装完成MariaDB之后,发现无论命令行还是程序中连接MariaDB的时候都很慢,大约要一二十秒,于是网上搜索了一番,发现下面的文章内容: 在进行 ping和route后发现网络通 ...
- centos7下搭建nginx+php7.1+mariadb+memcached+redis
一.环境准备 1.首先介绍一下环境,以及我们今天的主角们 我用的环境是最小化安装的centos7,mariadb(江湖传言mysql被oracle收购后,人们担心像java一样毁在oracle手上于是 ...
- Asp.Net Core 轻松学-使用MariaDB/MySql/PostgreSQL和支持多个上下文对象
前言 在上一篇文章中(Asp.Net Core 轻松学-10分钟使用EFCore连接MSSQL数据库)[https://www.cnblogs.com/viter/p/10243577.html],介 ...
- CentOS7下安装MySQL并配置远程连接
一.CentOS7下安装MySQL数据库 CentOS7默认的安装包里面已经没有 MySQL-Server安装包了,远程镜像中也没有了. 默认的是MariaDB (MySQL的一个分支,开发这个分支的 ...
- Linux - centos7 下 MySQL(mariadb) 和 主从复制
目录 Linux - centos7 下 MySQL(mariadb) 和 主从复制 MySQL(mariadb) 安装MySQL(mariadb) 配置数据库的中文支持 在远程用 mysql客户端去 ...
- CentOS7下mariadb日常管理
在CentOS7下,官方提供的mysql的rpm包就是mariadb,可查看mariadb包信息 [root@host ~]$rpm -qi mariadb # 需要先安装该包 Name : mari ...
- MariaDB Centos7 下安装MariaDB
Centos7 下安装MariaDB by:授客 QQ:1033553122 1.下载安装文件 rpm包为例,对于标准服务器安装,至少需要下载client,shared,serve文件(安装时如果少了 ...
- centos7下使用yum安装mysql
CentOS7的yum源中默认好像是没有mysql的.为了解决这个问题,我们要先下载mysql的repo源. 1. 下载mysql的repo源 wget http://repo.mysql.com/m ...
随机推荐
- 新建Microsoft Word文档
问题描述 L正在出题,新建了一个word文档,想不好取什么名字,身旁一人惊问:“你出的题目叫<新建Microsoft Word文档>吗?”,L大喜,一拍桌子,说:“好,就叫这个名字了.” ...
- ASP.NET MVC5----数据注解和验证
在使用MVC模式进行开发时,数据注解是经常使用的(模型之上操作),下面是我看书整理的一些常见的用法. 什么是验证,数据注解 验证 从全局来看,发现逻辑仅是整个验证的很小的一部分.验证首先需要管理用户友 ...
- commons-dbutils实现增删改查(spring新注解)
1.maven依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...
- Java基于SSM在线学习系统设计与实现
Spring+SpringMVC+MyBatis+Bootstrap+Vue开发在线学习系统 本课题的主要内容是开发基于Java EE的在线学习平台,使用MVC经典开发模式. ...
- 在mac下初次使用pygame踩坑纪实(卡死)
初次使用pygame实现绘图功能就踩坑 直接上代码 import pygame pygame.init() # 创建游戏的窗口 480 * 700screen = pygame.display.set ...
- Netty中CompositeByteBuf的理解以及读写操作
转载请注明出处 https://www.cnblogs.com/majianming/articles/the_composite_byte_buf_read_and_wite_operation_o ...
- BZOJ 3280: 小R的烦恼
Description 小R最近遇上了大麻烦,他的程序设计挂科了.于是他只好找程设老师求情.善良的程设老师答应不挂他,但是要 求小R帮助他一起解决一个难题.问题是这样的,程设老师最近要进行一项邪恶的实 ...
- SpringMVC 和 Struts2的区别
SpringMVC 和 Struts2的区别 1.Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方 ...
- DataGridView 调整列顺序为设计的顺序
设置: dataGridView1.AutoGenerateColumns = false;
- 温故知新的经典贪心题目:今年暑假不AC?
情景: “今年暑假不AC?” “是的.” “那你干什么呢?” “看世界杯呀,笨蛋!” “@#$%^&*%...” 确实如此,世界杯来了,球迷的节日也来了,估计很多ACMer也会抛开电脑,奔向电 ...