1. 程式人生 > 實用技巧 >QtCreator使用C語言連線Mysql體驗---解決undefined reference to `mysql_init' 問題

QtCreator使用C語言連線Mysql體驗---解決undefined reference to `mysql_init' 問題

上機環境 ubuntu 20.04 Qt 5.12

有時候寫博的目的是分享自己踩過的坑,為同樣喜愛程式設計的朋友樹立警示牌,以免他們熱情的心受到傷害。

我一直以來認為C/C++是黑客的標配武器,因此對這兩種語言有種膜拜的心情,好的語言當然要拿來連線資料庫,C也不例外。當你找到mysql的官方文件,他們依舊是非常灑脫的說:mysql就是用C語言實現的!言下之意當然是讓你去看mysql.h標頭檔案,幸運的是,你按照官方文件安裝mysql能夠順利的找到mysql.h檔案,以ubuntu20.04為例,按部就班的步驟,不出意外你在路徑 就可以找到

不過接下來,成批的函式宣告還是有點搞得人一頭霧水,猶如非法渠道獲得的重武器一樣,你別想得到原產大廠的技術指導,那些人永遠以為所有人都能輕易玩轉這些函式/介面,可是姑爺爺我就不行。

好在有許多先賢蹚出來一條路,這也使我慶幸自己得以降生在中國這樣一個國家裡,要是誕生在一個小國可能還麻煩了!

多數網上的實現表明,使用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之類,(沒試過,只是猜想)