在*nix类系统使用C/C++连接mysql8的诸多问题及解决方案【本文在macOS12下实现】
请各位巨佬手下留情,嘴下留情,弱菜备份一个解决方案。
首先需要安装mysql8,这里不再赘述。
默认安装目录是/usr/local/mysql
之后需要
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
libssl.1.1.dylib
和 libcrypto.1.1.dylib
是动态链接库,不仅这里要写上,在运行代码之前,需要将这两个动态库拷贝到 /usr/local/lib
下
在代码执行的时候会去调用这两个库,如果没有就会报错:【下列只是罗列了一个Clion的情况,由于笔者在写这篇文章的时候terminal已关闭,无法找到之前的日志文件和错误信息,所以网上找了一个】
dyld[72956]: Library not loaded: libssl.1.1.dylib
Referenced from: /Users/您的用户名/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 ./test

由于libmysqlclient.21.dylib文件没有导入这里可能还会报个错:@rpath/libmysqlclient.21.dylib 后面略
建议使用sudo ln -s /usr/local/mysql/lib/libmysqlclient.21.dylib /usr/local/lib/libmysqlclient.21.dylib
mac升级之后开启了SIP(System Integrity Protection),增加了rootless机制,导致即使在root权限下依然无法修改文件,在必要时候为了能够修改下面的文件,我们只能关闭该保护机制。但上面的方法可以无视SIP,【如果不用上面的方法而用:sudo ln -s /usr/local/mysql/lib/libmysqlclient.21.dylib /usr/lib/libmysqlclient.21.dylib,则往往会提示无法创建/usr/lib/libmysqlclient.21.dylib的软连接】。由于我不想关SIP,所以尝试了通过创建/usr/local/lib/libmysqlclient.21.dylib软连接来解决这个问题

之后提供一个测试的例子,您必须对例子中的汉字部分进行替换,用汉字是为了方便您定位(test.c)【C++ 同理】
#include <stdio.h>
#include <mysql.h>
const char host[] = "您的localhost";
const char user[] = 您的mysql用户名";
const char pwd[] = "您的mysql密码";
const char database[] = "要连接的数据库名";
unsigned int port = mysql端口号;
int main() {
MYSQL myCont;
mysql_init(&myCont);
if (mysql_real_connect(&myCont, host, user, pwd, database, port, nullptr, 0)) {
printf("Hello mysql\n");
}
else {
printf("connect failed!\n");
//如果要输出连接错误的信息,则将上述语句修改printf("ERROR Reson:%s",mysql_error(&myCont));
}
mysql_close(&myCont);
return 0;
}
编译运行:gcc -I /usr/local/mysql/include/ -L /usr/local/mysql/lib/ test.c -o test -lmysqlclient
然后./test
相信有一定基础的人应该能看明白例子的输出,这里不再赘述。