欢迎光临散文网 会员登陆 & 注册

在*nix类系统使用C/C++连接mysql8的诸多问题及解决方案【本文在macOS12下实现】

2022-12-09 14:54 作者:SynTimes  | 我要投稿

请各位巨佬手下留情,嘴下留情,弱菜备份一个解决方案。

首先需要安装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.dyliblibcrypto.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

相信有一定基础的人应该能看明白例子的输出,这里不再赘述。


在*nix类系统使用C/C++连接mysql8的诸多问题及解决方案【本文在macOS12下实现】的评论 (共 条)

分享到微博请遵守国家法律