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 的目录了。
记住这个路径,待会儿会用到。
第二步在代码中添加头文件
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.a
和 libmysqlservices.a
这两个库,这两个库中有 MySQL 的各种函数实现,libssl.1.1.dylib
和 libcrypto.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”。