C语言链接mysql数据库错误:
一 编译错误:
eg:用gcc编译出现如下的错误:
test.c:(.text+0x5e):对‘mysql_init’未定义的引用
但是在头文件中已经
#include<mysql/mysql.h>
解决方法是:
gcc xx.c -lmysqlclient -L/usr/lib64/mysql
二 由~mysql-config –libs –cflags~衍生的学习
出现 undefined reference to ‘xxxxx’错误,是因为源码没有什么问题,而是编译链接错误;也就是编译参数没有指定程序要用到的库文件。
- 比如上边连接mysql程序include 了 h 文件,但编译的时候没有指明这个库文件libmysqlclient.so 。
-l和-L 参数(gcc)
-l参数是指定库文件名 如 -lxx 那么xx真正的库文件名是libxx.so。如 mysql的库文件名是 libmysqlclient.so 那么就应该是 -lmysqlclient 。把-l去掉 lib+mysqlclient+.so=libmysqlclient.o 这就是mysql的库名。
-L/usr/lib64/mysql 如这个的意思是告诉gcc 这个 libmysqlclient.so 文件在 /usr/lib64/mysql 这个目录下。
那么完整的命令是 :
gcc xxxx.c -o xxxx -lmysqlclient -L/usr/lib64/mysql
这样是大概清楚了但库的文件名路径要手动去找吗?是不是有点麻烦下面我们来看一个命令
- /usr/bin/
- [root@localhost bin]# mysql_config –libs
- -L/usr/lib64/mysql -lmysqlclient -lpthread -lm -lrt -lssl -lcrypto -ldl
- 从该命令执行的结果可以看出我们要的东西:-L/usr/lib64/mysql -lmysqlclient 不就在这吗!很多软件都提供了这样的命令 xxxx_config –libs;
-I(大写的 i )参数 是指明头文件.h文件所在的目录比如 mysql.h 我的系统是centos 7 64 我的mysql 是 yum 安装的安全包 /usr/include/mysql 那么 -I/usr/include/mysql 这样的指明.h文件的路径。
- 下面我们来执行一个命令:
- [root@localhost mysql]# mysql_config –cflags
- -I/usr/include/mysql -m64
- -I/usr/include/mysql 不就.h文件的路径吗!当然一般应该不用指定.h的路径 在源码中include已经写了。
- gcc xxxx.c -o xxxx -lmysqlclient -L/usr/lib64/mysql