目录
1.引入库
要使用C语言连接MySQL,需要使用MySQL官网提供的库——libmysqlclient-dev。
1.1.一键安装
如果我们使用的是Linux系统的话我们可以直接使用的命令安装MySQL给我们提供的官方库。
要在Ubuntu 22.04上安装MySQL的开发包(通常包含用于开发MySQL应用程序所需的头文件和库),你应该使用apt命令。
以下是在Ubuntu 22.04上安装MySQL开发包的步骤:
- 更新软件包列表:
首先,确保你的软件包列表是最新的。打开终端并输入以下命令:
sudo apt-get update
- 安装MySQL开发包:
接下来,使用apt命令安装MySQL的开发包。在Ubuntu上,通常的MySQL开发包是libmysqlclient-dev。输入以下命令进行安装:
sudo apt-get install libmysqlclient-dev
这个包包含了开发MySQL客户端应用程序所需的头文件和库。
执行过程会遇到下面这个情况,直接按enter即可
- 验证安装:
安装完成后,下载完以后我们可以在/usr/include/mysql/(其他系统可能会有差别)看到头文件:
ls /usr/include/mysql/
可以看到有很多库文件啊!!
如果没有安装成功,就会像下面这样子
此外我们找一下我们的安装的库
sudo find /usr/lib -name 'libmysqlclient*.so*'
这几个是最主要的库文件
我们在上面这些路径里面也能看到对应的库: 这说明我安装成功了
没安装成功的情况如下:
如果不想用上面那个方式,我们可以使用下面这个方法
- 验证安装(第二种方法)
安装完成后,你可以通过检查安装的包来验证是否成功安装了MySQL开发包。输入以下命令:
dpkg -L libmysqlclient-dev
dpkg -L libmysqlclient-dev 命令会列出 libmysqlclient-dev 包安装的所有文件。您可以在输出中查找与头文件相关的路径。
如果没有安装成功,就会是下面这个样子
1.2.手动下载库
首先,进入MySQL官网,选择DOWNLOADS(下载),然后点击MySQL Community (GPL) Downloads。如下:
接下来选择C API(libmysqlclient)
我们进去之后按下面这个点击
查看自己MySQL服务器的版本号
SELECT VERSION();
进来之后按下面这个填就好了
注意:MySQL版本低于8.0.40的请按这个
进来之后发现怎么这么多啊?我该下载哪一个?
要在Ubuntu 22.04上使MySQL能够被C语言连接,你需要下载并安装libmysqlclient-dev库。这个库提供了MySQL的C API,使得C语言程序能够访问MySQL数据库。
根据提供的下载信息,你可以直接下载适用于Ubuntu 22.04的libmysqlclient-dev的DEB包,即:
- 文件名: libmysqlclient-dev_8.0.40-1ubuntu22.04_amd64.deb
我们把它放到桌面去
进入我们的ubuntu22.04的机器里面去,我们使用rz命令把这个文件上传到我们的系统里面
然后可以使用 dpkg-deb 命令,将 .deb 文件的内容解压到当前目录。
如下:
dpkg-deb -x libmysqlclient-dev_8.0.40-1ubuntu22.04_amd64.deb .
tree usr
这里面就是我们的库文件。
现在我们的库算是安装好了,具体怎么使用,我们下面再说
2.使用库
mysqlclient给我们提供了许多API,其官方手册中可以看到许多细节内容,此外还有一些关于mysqlclient库中一些结构体对象的含义可以看这里。
2.1.简单示例(一键安装的)
为了确保我们能够正常的将库引入进我们的代码中,我们可以先使用mysql_get_client_info()函数来进行测试。这个函数会返回 MySQL 客户端库的版本信息。以下是一个简单的示例,展示了如何在 C 语言中使用这个函数。
main.c
#include <mysql/mysql.h>
#include <stdio.h>
int main() {
// 调用 mysql_get_client_info 函数获取客户端库版本信息
const char *client_info = mysql_get_client_info();
// 打印客户端库版本信息
if (client_info) {
printf("MySQL client library version: %s\n", client_info);
} else {
printf("Failed to get MySQL client library version.\n");
}
// 注意:虽然这个示例没有实际连接到数据库,但调用 mysql_get_client_info 不需要连接
// 如果你需要进行数据库操作,需要初始化 MySQL 库并连接数据库,这超出了这个简单示例的范围
return 0;
}
为了方便后续重复编译源文件,可以在项目目录下创建一个Makefile,Makefile当中的内容如下:
test:main.c
gcc -o $@ $^ -std=c99 -L /usr/lib/x86_64-linux-gnu -lmysqlclient
.PHONY:clean
rm -rf test
注意:
-L 和 -l 是 GCC(GNU Compiler Collection)编译器在链接阶段使用的两个选项,它们分别用于指定库文件的搜索路径和要链接的库。
-L 选项:
- -L 选项后面跟着的是库文件的搜索路径。当你链接一个程序时,链接器需要找到程序所依赖的所有库文件。-L 选项就是用来告诉链接器在哪些目录下搜索这些库文件的。例如,如果你有一个库文件位于 /usr/local/lib 目录下,而链接器默认不在这个目录下搜索库文件,那么你就需要使用 -L/usr/local/lib 来指定这个搜索路径。
-l 选项:
- -l 选项后面跟着的是要链接的库的名字(注意,这里不需要加前缀 lib 和文件后缀,如 .so 或 .a)。GCC 会自动在这个名字前加上 lib 前缀,并在系统默认的库路径或你通过 -L 选项指定的路径下搜索名为 lib<库名>.so(对于动态库)或 lib<库名>.a(对于静态库)的文件。例如,如果你想要链接数学库,你可以使用 -lm,GCC 就会去搜索名为 libm.so 或 libm.a 的文件。
- 注意 -l 和库名之间不应该有空格
我的库安装在下面这个目录里面
gcc -o $@ $^ -std=c99 -L /usr/lib/x86_64-linux-gnu -lmysqlclient
这条命令的意思是:使用 GCC 编译器,将 $^(代表所有的依赖文件,这里应该是 main.c)编译并链接成一个名为 $@(代表目标文件,这里应该是 test)的可执行文件,使用 C99 标准,在 /usr/lib/x86_64-linux-gnu 目录下搜索库文件,并链接名为 mysqlclient 的库。
这里我们没有指定头文件的搜索路径,因为我们mysql头文件在/usr/inclue目录下,这是gcc编译时的默认搜索路径,所以我们不需要指定。
查看自己MySQL服务器的版本号
SELECT VERSION();
我们发现完全对的上!!所以我们是成功了!!!!!
从运行结果我们能够看出我们使用的客户端库版本是5.744,此外我们还可以使用ldd命令查看程序运行所需要的库
我们发现我们成功连接上我们的库了!!
2.2.简单示例(手动下载的)
我们换一台机器来,因为这个的测试不能在上面那个apt安装的环境下测试!!因为那个会影响到我们!!
如果说我们是按照我上面那样手动下载的,那么我们就来展示一下怎么使用那个吧!!!
main.c
#include <mysql/mysql.h>
#include <stdio.h>
int main() {
// 调用 mysql_get_client_info 函数获取客户端库版本信息
const char *client_info = mysql_get_client_info();
// 打印客户端库版本信息
if (client_info) {
printf("MySQL client library version: %s\n", client_info);
} else {
printf("Failed to get MySQL client library version.\n");
}
// 注意:虽然这个示例没有实际连接到数据库,但调用 mysql_get_client_info 不需要连接
// 如果你需要进行数据库操作,需要初始化 MySQL 库并连接数据库,这超出了这个简单示例的范围
return 0;
}
首先我们要搞清楚我们安装的库和头文件在哪里
很好,我们的文件都是在/root/MYSQL/usr/里面 注意:
GCC和G++编译器在编译C或C++程序时,可以通过-I (大写i)选项来指定头文件的路径。这个选项告诉编译器在默认的搜索路径之外,还需要在哪些目录中查找头文件。
例如,如果你的头文件位于/home/user/include目录下,你可以在编译命令中添加-I/home/user/include来指定这个路径。这样,编译器在编译程序时,就会在这个目录下查找你包含的头文件。
具体的使用方式如下:
gcc -I/home/user/include main.c -o main_program
在这个例子中,-I/home/user/include就是告诉GCC编译器在/home/user/include目录下搜索头文件,然后编译main.c文件,生成名为main_program的可执行文件。
此外,GCC还允许你使用多个-I选项来指定多个头文件搜索路径。编译器会按照这些路径的顺序进行搜索,直到找到所需的头文件为止。如果编译器在指定的路径和默认路径中都没有找到头文件,那么编译过程就会报错,提示找不到头文件。
需要注意的是,-I选项只影响编译阶段,对链接阶段没有影响。如果你需要指定库文件的路径,应该使用-L选项。同时,如果你需要链接特定的库,应该使用-l选项(注意这里不需要加前缀lib和文件后缀,如.so或.a)。
为了方便后续重复编译源文件,可以在项目目录下创建一个Makefile,Makefile当中的内容如下:
test:main.c
gcc -o $@ $^ -std=c99 -I /root/MYSQL/usr/include -L /root/MYSQL/usr/lib/x86_64-linux-gnu -lmysqlclient
.PHONY:clean
rm -rf test
注意:
- 头文件路径:/root/MYSQL/usr/include
- 库路径:/root/MYSQL/usr/x86_64-linux-gun
我们使用gcc来编译,运行起来报错了!!链接错误通常表明编译器在链接阶段找不到C++标准库中的一些必需函数和对象的定义。c++?这就说明我们应该使用g++来编译!!!
test:main.c
g++ -o $@ $^ -std=c++11 -I /root/MYSQL/usr/include -L /root/MYSQL/usr/lib/x86_64-linux-gnu -lmysqlclient
.PHONY:clean
rm -rf test
很好和我们的版本对上了!!!
如果想要其他更多的使用方法,请去:【Linux】基础I/O——动静态库的制作_linux编译静态库-CSDN博客