前言

连接数据库通常在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数据库

最新文章

  1. iOS 架构模式MVVM
  2. idea-生成key的Java代码
  3. .net发邮件【转】
  4. android webview实战
  5. Be Careful With BuildConfig.DEBUG
  6. C++学习14 继承的概念及语法
  7. C++著名程序库的比较和学习经验 (转)
  8. Oracle DataGuard搭建(二)
  9. jQuery选项卡插件、Tabs插件
  10. Cookie中用户登录信息登录验证
  11. 【转】win7 虚拟机virtualbox中ubuntu12.04安装samba实现文件共享
  12. out.print和out.write方法
  13. (一)MVP设计模式
  14. viewport移动端的meta
  15. Django—常用功能
  16. Javascript高级编程学习笔记(52)—— DOM2和DOM3(4)元素大小
  17. Failure to transfer org.apache.maven.plugins:maven-surefire-plugin:pom:2.12.4
  18. dubbo 基础入门
  19. LINQ学习之旅(二)
  20. Mysqldump 参数大全

热门文章

  1. 转:Laravel 项目开发规范
  2. WinForm WebBrowser 设置IE版本
  3. 3、MapReduce详解与源码分析
  4. Python第三方库requests的编码问题
  5. 【35】单层卷积网络(simple convolution)
  6. 预防XSs和sql注入常见分析
  7. 专访|高思教育创始人须佶成(上)【UncleW】
  8. 根据指定id取出数组中指定对象
  9. Fiddler抓取https方法
  10. 《UNIX环境高级编程》源码配置——apue.3e 安装