Photo by Igor Miske on Unsplash

原本以为上一篇博客就是今年最后一片博客了,今天突发奇想,想用 C++ 操作一下 MySQL,然后就又折腾了好久,一度想要放弃,最后在我坚持不懈的努力下,终于成功了,但也只是连接上,并没有对增删改查进行封装,后面封装好了再写(水)一篇博客,诶嘿。

环境

软硬件 参数
操作系统 MacOs Monterey(version 12.0.1)
芯片 Apple M1
g++ / gcc 4.2.1
clang 13.0.0
CMake 17
Clion 2021.2.3

其实这里并没有涉及到编译,所以 g++,GCC 和 Clang 并需要跟我统一,CMake 版本主要是代码编译链接的时候用的,也没必要跟我一样。

第一步先安装 MySQL

MacOs 虽然是类 Linux 系统,但还是有本质上的区别的,网上很多在 linux 上进行的操作我亲自操作后不可以使用,比如安装 libmysqld-dev 或者 mysql-devel,因为没有 MacOs 的特供搬,也可能是我没找到,所以直接就选择安装整个 MySQL 了。

官网下载 MySQL 安装包

官网下载地址

这里一定要下载对应的平台,比如我的是 M1 的,下载的就是(ARM,64-bit)版本的。下载下来后一路默认安装就行。然后你就可以在以下路径看到一个 MySQL 的目录了。

1
/usr/local/mysql

记住这个路径,待会儿会用到。

第二步在代码中添加头文件

CMakeList.txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
cmake_minimum_required(VERSION 3.20)
project(cty)

set(CMAKE_CXX_STANDARD 17)

# 设置别名
set(MYSQL_HEADER /usr/local/mysql/include)
set(MYSQL_LIB /usr/local/mysql/lib)

# 添加 MySQL 连接头文件
include_directories(${MYSQL_HEADER})
# 添加 MySQL 外部库
link_libraries(${MYSQL_LIB})

# 添加执行程序
add_executable(cty main.cpp)

# 添加链接库
target_link_libraries(cty ${MYSQL_LIB}/libmysqlclient.a)
target_link_libraries(cty ${MYSQL_LIB}/libmysqlservices.a)
target_link_libraries(cty ${MYSQL_LIB}/libssl.1.1.dylib)
target_link_libraries(cty ${MYSQL_LIB}/libcrypto.1.1.dylib)

解释一下,target_link_libraries 必须要在 add_executable 之后,因为要先编译再链接,顺序不能错。其次,一定要引入 libmysqlclient.alibmysqlservices.a 这两个库,这两个库中有 MySQL 的各种函数实现,libssl.1.1.dyliblibcrypto.1.1.dylib 是动态链接库,不仅这里要写上,在运行代码之前,需要将这两个动态库拷贝到 /usr/local/lib 下:

1
2
sudo cp /usr/local/mysql/lib/libssl.1.1.dylib /usr/local/lib
sudo cp /usr/local/mysql/lib/libcrypto.1.1.dylib /usr/local/lib

在代码执行的时候会去调用这两个库,如果没有就会报错:

1
2
3
4
dyld[72956]: Library not loaded: libssl.1.1.dylib
Referenced from: /Users/chentianyi/Program/Clion-workplace/test/cmake-build-debug/cty
Reason: tried: 'libssl.1.1.dylib' (no such file), '/usr/local/lib/libssl.1.1.dylib' (no such file), '/usr/lib/libssl.1.1.dylib' (no such file), '/Users/chentianyi/Program/Clion-workplace/test/cmake-build-debug/libssl.1.1.dylib' (no such file), '/usr/local/lib/libssl.1.1.dylib' (no such file), '/usr/lib/libssl.1.1.dylib' (no such file)
zsh: abort ./cty

代码测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <mysql.h>

using namespace std;

const char host[] = "IP 地址";
const char user[] = "user";
const char pwd[] = "password";
const char database[] = "database";
unsigned int port = 3306;

int main() {
MYSQL myCont;
mysql_init(&myCont);

if (mysql_real_connect(&myCont, host, user, pwd, database, port, nullptr, 0)) {
cout << "Hello MySQL" << endl;
} else {
cout << "connect failed!" << endl;
}

mysql_close(&myCont);
return 0;
}

如果没有什么问题,输出结果就是 “Hello MySQL”。