此专栏所有章节快速导航
01_MySQL数据库_CentOS7安装MySQL
02_MySQL数据库_数据库基础知识
03_MySQL数据库_库的操作
04_MySQL数据库_表的操作
05_MySQL数据库_数据类型
06_MySQL数据库_表的约束
07_MySQL数据库_增删查改
08_MySQL数据库_复合查询
09_MySQL数据库_索引
10_MySQL数据库_事务管理
11_MySQL数据库_用户管理
12_MySQL数据库_CentOS7下C-C++链接MySQL
一. 链接mysqlclient动态库时报错
1.1 报错提示信息
/opt/rh/devtoolset-7/root/usr/libexec/gcc/x86_64-redhat-linux/7/ld: 找不到 -lmysqlclient collect2: error: ld returned 1 exit status make: *** [test_mysql] 错误 1
1.2 分析原因
提示结果为找不到动态库,经过排查我发现
mysql
的动静态库安装时不在/usr/lib64
下,而是在/usr/lib64/mysql
目录下,如下图所示
1.3 解决方法
下面是我的Makefile文件
test_mysql:test_mysql.cpp
g++ -o $@ $^ -std=c++11 -L/usr/lib64/mysql -lmysqlclient # 编译时用-L指明所在目录
.PHONY:clean
clean:
rm -rf test_mysql
二. C/C++链接MySQL代码部分
#include <iostream>
#include <cstdio>
#include <mysql/mysql.h>
#include <string>
const char* const host = "127.0.0.1"; // 数据库所在主机的IP地址
const char* const user = "lihua"; // 数据库用户名
const char* const password = "Ji3#.10086"; // 数据库用户对应的密码
const char* const db = "db_for_lihua"; // 需要操作的数据库
const unsigned int port = 3306; // 数据库端口号
int main()
{
// 1. 创建mysql句柄
MYSQL* mysql1 = mysql_init(nullptr);
// 获取mysql数据库版本信息
//std::cout << "mysql version:" << mysql_get_client_info() << std::endl;
// 2. 连接数据库
if (mysql_real_connect(mysql1, host, user, password, db, port, nullptr, 0) == nullptr)
{
std::cerr << "connet failed!" << std::endl;
return 1;
}
else
{
std::cout << "connect success!" << std::endl;
// 设置连接的编码格式
mysql_set_character_set(mysql1, "utf8"); // 如果发现插入数据为乱码就需要改一下编码格式
// 3. 执行sql语句
// 3.1 插入
// std::string sql = "insert into student(name) value('李华')";
// 3.2 查询
std::string sql = "select * from student";
// 执行sql语句
int code = mysql_query(mysql1, sql.c_str());
if (code != 0)
{
std::cerr << "execute:" << sql << " failed" << std::endl;
}
else
{
std::cout << "execute:" << sql << "success" << std::endl;
// 3.2.1 获取查询结果的行号和列号
MYSQL_RES* result = mysql_store_result(mysql1);
int row = mysql_num_rows(result);
int col = mysql_num_fields(result);
// 3.2.2 获取字段名
MYSQL_FIELD* field = mysql_fetch_fields(result);
for (int i = 0; i < col; i++)
{
std::cout << field[i].name << "\t";
}
std::cout << std::endl;
// 3.2.3 获取查询的结果(不包括字段行)
for (int i = 0; i < row; i++)
{
MYSQL_ROW line = mysql_fetch_row(result); // MYSQL_ROW是一个二级指针
for (int j = 0; j < col; j++)
{
std::cout << line[j] << "\t";
}
std::cout << std::endl;
}
//free(result_backup);
}
}
mysql_close(mysql1);
return 0;
}