上機環境 ubuntu 20.04 Qt 5.12
有時候寫博的目的是分享自己踩過的坑,為同樣喜愛編程的朋友樹立警示牌,以免他們熱情的心受到傷害。
我一直以來認為C/C++是黑客的標配武器,因此對這兩種語言有種膜拜的心情,好的語言當然要拿來連接數據庫,C也不例外。當你找到mysql的官方文檔,他們依舊是非常灑脫的說:mysql就是用C語言實現的!言下之意當然是讓你去看mysql.h頭文件,幸運的是,你按照官方文檔安裝mysql能夠順利的找到mysql.h文件,以ubuntu20.04為例,按部就班的步驟,不出意外你在路徑 /usr/include/mysql 就可以找到
不過接下來,成批的函數聲明還是有點搞得人一頭霧水,猶如非法渠道獲得的重武器一樣,你別想得到原產大廠的技術指導,那些人永遠以為所有人都能輕易玩轉這些函數/接口,可是姑爺爺我就不行。
好在有許多先賢蹚出來一條路,這也使我慶幸自己得以降生在中國這樣一個國家里,要是誕生在一個小國可能還麻煩了!
多數網上的實現表明,使用C語言連接mysql之前
1.我們要在項目中引入mysql/mysql.h
2.聲明 MYSQL* 類的變量(感覺像個結構體指針,用於承載連接任務,儲存查詢結果等),我聲明的變量為mysql
3.對MYSQL*進行初始化,調用mysql_init()
如果你參考了近些年的博客,那么多數范例中給出的函數都有效,但是注意,一些函數的簽名(參數傳入順序及類型,數量)有所調整,我的做法是大的實現思路參考網上范例,真正代碼實現按照你機器上的mysql.h給出的函數簽名執行!
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <mysql/mysql.h> 4 5 6 7 8 MYSQL *mysql; 9 MYSQL_ROW ret_rownum; 10 MYSQL_RES* res; 11 const char *host="你的 mysql IP"; 12 const char *user="root"; 13 const char *passwd="你的密碼"; 14 const char *db="dingsbookroom"; 15 int retnum=0; 16 void connectdb(); 17 18 19 20 21 int main() 22 { 23 connectdb(); 24 printf("Hello World!\n"); 25 return 0; 26 } 27 void connectdb() 28 { 29 mysql=mysql_init(NULL); 30 if(!mysql_real_connect(mysql, host,user, passwd,db, 3306,NULL,0)) 31 { 32 printf("hell~no\n"); 33 } 34 mysql_query(mysql,"set names utf-8"); 35 const char* querystat ="select * from conntest"; 36 mysql_real_query(mysql,querystat,strlen(querystat)); 37 res=mysql_store_result(mysql); 38 retnum = mysql_num_rows(res); 39 printf("mapping rows %d\n",retnum); 40 }
問題出現了,編譯時mysql_init()就提示錯誤 undefined reference to `mysql_init'
what the hell!
估計很多小伙伴跟我一樣心臟病差點發了,放棄linux轉windows!什么?windows以后也可能往linux發展?那把微軟大當家的劫持了!
網上一些提示是:雖然我們引入了 mysql.h但是真正的實現在一個名為libmysqlclient的目標文件里(linux下應該為libmysqlclient.so windows下為 libmysqlclient.dll)
所以解決方法是在我們的項目中加入這一目標文件!
選中項目根目錄 這里是connmysql 然后右鍵點擊 Add Library
這樣,你的mysql_init()和其他函數得以正常工作了!
項目中的pro文件也包含了保證功能正常實現的庫文件路徑如下圖(局部):
運行結果:
同理,如果是在windows下的visual studio,估計需要在項目下包含libmysqlclient.dll之類,(沒試過,只是猜想)