【国产桌面操作系统】安装mysql客户端及C/C++开发
前言
统信UOS无法在线安装mysql客户端的驱动包,需要到官网下载离线包进行安装配置。
离线安装包下载
https://dev.mysql.com/downloads/https://dev.mysql.com/downloads/
https://downloads.mysql.com/archives/c-c/https://downloads.mysql.com/archives/c-c/这个最后一张图片的连接,如果失效就按照上面的步骤逐步操作(本篇资源有这个包)。
安装mysql客户端
解压安装
解压后,只需要对include和lib目录进行操作
#在root用户权限下
#1.把include目录拷贝到/usr/include之下
cp -rf include /usr/include/mysql
#2.把lib目录下的libmysqlclient.so.18,拷贝到/usr/lib64/mysql/,并建一个软连接
mkdir /usr/lib64/mysql
cp lib/libmysqlclient.so.18 /usr/lib64/mysql/
cd /usr/lib64/mysql/
ln -s libmysqlclient.so libmysqlclient.so.18
如果不建立软连接,编译完程序之后,用ldd查看程序的动态库链接时,可能会提示:not found。
开发编译
gcc -g -o client -I /usr/include/mysql mysqlc.c -L /usr/lib64/mysql -l mysqlclient-I /usr/include/mysql 指头文件所在位置
-L /usr/lib64/mysql 指库文件所在位置
-l mysqlclient 使用库mysqlclient (库文件名是libmysqlclient.so,库文件名是库名前加lib,后加.so)
注意,以上编译之前需要设置下环境
export LD_LIBRARY_PATH=/usr/lib64/mysql:$LD_LIBRARY_PATH
如果不想设置环境,就把libmysqlclient.so拷贝一份到系统默认的库路径里面,比如统信UOS和麒麟的默认目录都是
/lib/x86_64-linux-gnu/
开发样例
查询语句样例
#include <mysql.h>
//mysql数据库信息
typedef struct mysqldbMsg
{std::string db_ip;std::string db_name;std::string db_user;std::string db_pwd;mysqldbMsg(){db_ip="";db_name="";db_user="";db_pwd="";}
} stmysqldbMsg;bool selecttable(stmysqldbMsg& st_sqldb){std::string numstr="0";char sqlstr[256]={0};sprintf(sqlstr,"SELECT COUNT(1) FROM mytable;",CputId.c_str());MYSQL mysql_conn; /* Connection handle */MYSQL_RES *mysql_result; /* Result handle */MYSQL_ROW mysql_row; /* Row data *///int /*f1, f2,*/ num_row=0, num_col=0;if (mysql_init(&mysql_conn) != NULL){if (mysql_real_connect(&mysql_conn, st_sqldb.db_ip.c_str(), st_sqldb.db_user.c_str(), st_sqldb.db_pwd.c_str(), st_sqldb.db_name.c_str(), 3306, NULL, 0) != NULL){//std::cout << __FUNCTION__ << " mysql_real_connect OK" << std::endl;}else{std::cout << __FUNCTION__ << " mysql_real_connect fails" << std::endl;return false;}}else{std::cout << __FUNCTION__ << " Initialization fails" << std::endl;return false;}if (mysql_query(&mysql_conn, sqlstr) == 0){/* 查询表中所有记录*/mysql_result = mysql_store_result(&mysql_conn); // get the result from the executing select query//num_row = mysql_num_rows(mysql_result); /* Get the no. of row *///num_col = mysql_num_fields(mysql_result); /* Get the no. of column *///printf("num_row [%d], num_col [%d]\n", num_row, num_col);mysql_row = mysql_fetch_row(mysql_result); /* Fetch one by one */numstr=mysql_row[0];std::cout << __LINE__ << " count num:" << numstr << std::endl;// for (f1 = 0; f1 < num_row; f1++)// {// for (f2 = 0; f2 < num_col; f2++)// {// mysql_row = mysql_fetch_row(mysql_result); /* Fetch one by one */// printf("[Row %d, Col %d] ==> [%s]\n", f1, f2, mysql_row[f2]);// }// }}else{printf("Query fails\n");}mysql_free_result(mysql_result);mysql_close(&mysql_conn);if(numstr=="0") return false;return true;
}
执行语句样例
bool execsql(const char* sqlstr,stmysqldbMsg& st_sqldb){MYSQL mysql_conn; /* Connection handle *///MYSQL_RES *mysql_result; /* Result handle */if (mysql_init(&mysql_conn) != NULL){if (mysql_real_connect(&mysql_conn, st_sqldb.db_ip.c_str(), st_sqldb.db_user.c_str(), st_sqldb.db_pwd.c_str(), st_sqldb.db_name.c_str(), 3306, NULL, 0) != NULL){std::cout << __FUNCTION__ << " mysql_real_connect OK" << std::endl;}else{std::cout << __FUNCTION__ << " mysql_real_connect fail" << std::endl;return false;}// 设置字符集为 utf8mb4---有中文时,一定要加这一项设置,不然中文变成乱码if (mysql_set_character_set(&mysql_conn, "utf8mb4")) {std::cerr << "mysql_set_character_set() failed\n";mysql_close(&mysql_conn);return false;}}else{std::cout << __FUNCTION__ << " Initialization fails" << std::endl;return false;}if (mysql_query(&mysql_conn, sqlstr) == 0){//std::cout << __FUNCTION__ << " mysql_query OK:" << sqlstr << std::endl;}else{std::cout << __FUNCTION__ << " mysql_query fail:" << sqlstr << std::endl;}//mysql_free_result(mysql_result);mysql_close(&mysql_conn);return true;
}
Makefile文件
CC = g++
CFLAGS =
DEBUGFLAG = -g -Wall
MACRO =
#MACRO = -D_DEBUG
LIBDIRS = -L./ -L /usr/lib64/mysql
LIBS = -ldl -lmysqlclient
INCLUDE = -I./ -I /usr/include/mysql -I./lib
MAKE_SO =
OPTIONS =
OBJDIR =
SRCDIR =
RUNOUTPUT = getdatabymysql
LIBOUTPUT =
OBJS = getdatabymysql.o default:$(RUNOUTPUT)clean:rm -f $(OBJS) $(RUNOUTPUT)install:cp -f $(RUNOUTPUT) ../../bin$(RUNOUTPUT):$(OBJS)$(CC) -o $(RUNOUTPUT) $^ $(OPTIONS) $(LIBDIRS) $(LIBS).cpp.o:$(CC) $(DEBUGFLAG) $(MACRO) -fPIC -c $< -o $@ $(CFLAGS) $(INCLUDE)