在*nix類系統(tǒng)使用C/C++連接mysql8的諸多問(wèn)題及解決方案【本文在macOS12下實(shí)現(xiàn)】
請(qǐng)各位巨佬手下留情,嘴下留情,弱菜備份一個(gè)解決方案。
首先需要安裝mysql8,這里不再贅述。
默認(rèn)安裝目錄是/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
是動(dòng)態(tài)鏈接庫(kù),不僅這里要寫上,在運(yùn)行代碼之前,需要將這兩個(gè)動(dòng)態(tài)庫(kù)拷貝到 /usr/local/lib
下
在代碼執(zhí)行的時(shí)候會(huì)去調(diào)用這兩個(gè)庫(kù),如果沒(méi)有就會(huì)報(bào)錯(cuò):【下列只是羅列了一個(gè)Clion的情況,由于筆者在寫這篇文章的時(shí)候terminal已關(guān)閉,無(wú)法找到之前的日志文件和錯(cuò)誤信息,所以網(wǎng)上找了一個(gè)】
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文件沒(méi)有導(dǎo)入這里可能還會(huì)報(bào)個(gè)錯(cuò):@rpath/libmysqlclient.21.dylib 后面略
建議使用sudo ln -s /usr/local/mysql/lib/libmysqlclient.21.dylib /usr/local/lib/libmysqlclient.21.dylib
mac升級(jí)之后開(kāi)啟了SIP(System Integrity Protection),增加了rootless機(jī)制,導(dǎo)致即使在root權(quán)限下依然無(wú)法修改文件,在必要時(shí)候?yàn)榱四軌蛐薷南旅娴奈募?,我們只能關(guān)閉該保護(hù)機(jī)制。但上面的方法可以無(wú)視SIP,【如果不用上面的方法而用:sudo ln -s /usr/local/mysql/lib/libmysqlclient.21.dylib /usr/lib/libmysqlclient.21.dylib,則往往會(huì)提示無(wú)法創(chuàng)建/usr/lib/libmysqlclient.21.dylib的軟連接】。由于我不想關(guān)SIP,所以嘗試了通過(guò)創(chuàng)建/usr/local/lib/libmysqlclient.21.dylib軟連接來(lái)解決這個(gè)問(wèn)題

之后提供一個(gè)測(cè)試的例子,您必須對(duì)例子中的漢字部分進(jìn)行替換,用漢字是為了方便您定位(test.c)【C++ 同理】
#include <stdio.h>
#include <mysql.h>
const char host[] = "您的localhost";
const char user[] = 您的mysql用戶名";
const char pwd[] = "您的mysql密碼";
const char database[] = "要連接的數(shù)據(jù)庫(kù)名";
unsigned int port = mysql端口號(hào);
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");
????????//如果要輸出連接錯(cuò)誤的信息,則將上述語(yǔ)句修改printf("ERROR Reson:%s",mysql_error(&myCont));
??? }
??? mysql_close(&myCont);
??? return 0;
}
編譯運(yùn)行:gcc -I /usr/local/mysql/include/ -L /usr/local/mysql/lib/ test.c -o test -lmysqlclient
然后./test
相信有一定基礎(chǔ)的人應(yīng)該能看明白例子的輸出,這里不再贅述。