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为例,按部就班的步骤,不出意外你在路径 /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之类,(没试过,只是猜想)