这两天在学习总结MySQL的C API的过程中,写了几个小的示例。但是,在编译的阶段中总是出错,编译无法通过。现解决问题,并总结如下。
1.问题再现
写完源程序之后,键入如下命令,提示找不到mysql.h头文件:
1 2 3 4 5 |
# gcc -Wall -g mysqlDemo1.c -o mysqlDemo1 mysqlDemo1.c:4:19: fatal error: mysql.h: No such file or directory #include "mysql.h" ^ compilation terminated. |
于是,上网查阅相关资料,给出的解决方案层出不穷。说是因为电脑中没有安装mysql,或是没有安装mysql库等等,于是按照其中一个感觉挺靠谱的方法使用命令yum install libmysql++-dev去安装mysql库:
1 2 3 4 5 |
# yum install libmysql++-dev Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile No package libmysql++-dev available. Error: Nothing to do |
结果提示没有找到这个包,这个方法尝试失败。
2.解决之路
因为我记得我的Linux中是有mysql相关库文件的,于是使用如下find命令,找到了mysql.h头文件的所在路径:
1 2 |
# find / -type f -name mysql.h /usr/local/mysql/include/mysql.h |
找到头文件所在路径之后,喜出望外,这下应该没问题了吧,执行如下编译命令:
1 2 3 4 5 6 7 8 9 10 11 |
# gcc -Wall -g mysqlDemo1.c -o mysqlDemo1 -I /usr/local/mysql/include/ /tmp/cc9QoGXT.o: In function `main': /home/mysql/mysqlDemo1.c:18: undefined reference to `mysql_init' /home/mysql/mysqlDemo1.c:19: undefined reference to `mysql_real_connect' /home/mysql/mysqlDemo1.c:23: undefined reference to `mysql_query' /home/mysql/mysqlDemo1.c:25: undefined reference to `mysql_store_result' /home/mysql/mysqlDemo1.c:28: undefined reference to `mysql_num_fields' /home/mysql/mysqlDemo1.c:30: undefined reference to `mysql_fetch_field' /home/mysql/mysqlDemo1.c:34: undefined reference to `mysql_num_rows' /home/mysql/mysqlDemo1.c:43: undefined reference to `mysql_fetch_row' collect2: error: ld returned 1 exit status |
结果仍然报错,不过值得庆幸的一点是第一个错误没有再出现。
这是因为没有链接到lmysqlclient库导致的,于是修改编译命令,继续尝试:
1 2 3 |
# gcc -Wall -g mysqlDemo1.c -o mysqlDemo1 -I /usr/local/mysql/include/ -lmysqlclient /usr/bin/ld: cannot find -lmysqlclient collect2: error: ld returned 1 exit status |
结果再次报错,提示找不到库文件mysqlclient。
我们知道,存放库文件的目录lib和存放头文件的目录include一般是放在同一个目录下的,于是返回之前找到mysql.h头文件的路径,发现lib目录下有如下动态库和静态库:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# cd /usr/local/mysql/lib/ # ll total 267056 -rw-r--r-- 1 root mysql 19357480 Apr 5 2016 libmysqlclient.a lrwxrwxrwx 1 root mysql 20 Apr 5 2016 libmysqlclient.so -> libmysqlclient.so.18 lrwxrwxrwx 1 root mysql 24 Apr 5 2016 libmysqlclient.so.18 -> libmysqlclient.so.18.1.0 -rwxr-xr-x 1 root mysql 8869036 Apr 5 2016 libmysqlclient.so.18.1.0 lrwxrwxrwx 1 root mysql 16 Apr 5 2016 libmysqlclient_r.a -> libmysqlclient.a lrwxrwxrwx 1 root mysql 17 Apr 5 2016 libmysqlclient_r.so -> libmysqlclient.so lrwxrwxrwx 1 root mysql 20 Apr 5 2016 libmysqlclient_r.so.18 -> libmysqlclient.so.18 lrwxrwxrwx 1 root mysql 24 Apr 5 2016 libmysqlclient_r.so.18.1.0 -> libmysqlclient.so.18.1.0 -rw-r--r-- 1 root mysql 244928440 Apr 5 2016 libmysqld.a -rw-r--r-- 1 root mysql 14454 Apr 5 2016 libmysqlservices.a drwxr-xr-x 3 root mysql 4096 Apr 5 2016 plugin |
这些动态库和静态库正是我们程序在链接阶段需要链接的库文件,于是修改编译命令如下,再次尝试:
1 2 |
# gcc -Wall -g mysqlDemo1.c -o mysqlDemo1 -I /usr/local/mysql/include/ -L /usr/local/mysql/lib/ -lmysqlclient # |
无报错,编译通过。
附:关于find命令和gcc编译器使用的相关内容,可以参考我的其他博文。