在CentOS里使用MySQL C API
操作系统:CentOS6 (32或64位)
真的是很困难,对于一个一直在windows下开发的程序员来说,在linux下想解决点问题,还真的要付出很多呀!为了在CentOS里使用MySQL C API ,这几天一直在不断努力,苍天不负有心人,终于能够在CentOS里使用MySQL C API 了!!!
昨天折腾到下半夜1点多,终于从另外一个方向搞定了,是安装新版的MySQL;今天经过努力,在CentOS默认安装环境里,使用上系统默认安装的MySQL,也成功配置并使用上了MySQL C API。我想我遇到的问题,可能很多朋友会遇到,尤其是刚刚进入Linux的朋友,不敢独享,在此写出完整处理过程,以便各位朋友能够少走弯路,更快使用上MySQL C API !!
好了,下面就开始说说我怎么处理的吧,我们是使用CentOS默认安装环境里的MySQL,并不是安装新版MySQL。建议大家用root帐号登入,这样修改一些东西比较方便。
1,启动MySQL。要使用MySQL C API ,第一件事就是确认是否有MySQL和MySQL C API ,CentOS刚安装完毕时候,如果没有做任何修改,那么你的系统中已经安装了MySQL,版本为5.1.61。这时MySQL并没有启动,我们需要在“系统”->“管理”->“服务”中找到“mysqld”,随后启动它,确认启动完毕后,在终端中输入“mysql”就会出现MySQL的提示信息了。
2,获得MySQL C API 的头文件和库。我们在终端中输入“whereis mysql”,大家会发现并没有一个叫“/usr/include/mysql”的目录,这个目录一般是开发MySQL程序的头文件的存放目录。没有不要紧,我们去mysql官方网站(http://www.mysql.com/),找到“MySQL Connectors”,随后选择“Connector/C”,进入这个链接页面后,选择自己的操作系统和版本,我们现在用32位系统,所以选择了32位的linux版本,是一个tar文件,具体下载链接:http://cdn.mysql.com/Downloads/Connector-C/mysql-connector-c-6.0.2-linux-glibc2.3-x86-32bit.tar.gz ,点击下载完毕后,我们继续下一步。
3,把MySQL C API 的头文件和库放到合适地方。首先解压缩我们刚才下载的tar文件,解压缩后,里面有目录和文件,我们只需要两个目录里的文件:“include”和"lib"。
A,首先创建"/usr/include/mysql",把解压缩目录中的"include"目录中所有文件,拷贝到"/usr/include/mysql"目录中。
B,把解压缩目录中的"lib"目录中所有文件,拷贝到“/usr/lib/mysql/”中。
“/usr/include/mysql”目录存放文件是我们程序中要用到的头文件;“/usr/lib/mysql/”目录中存放文件是我们编译程序时候需要链接的库文件。
4,在MySQL中创建测试用的表。表名称“ndb_test”。启动终端,在终端中执行下列命令:
mysql -u root
use test;
create table ndb_test (user varchar(30),password varchar(30));
执行完上述语句后,我们就在MySQL中建立了一个叫“ndb_test”的表了。
5,准备测试程序。我们创建一个叫“mysql.c”的文件,在这个文件中写上下列代码:
#include <mysql.h>
#include <stdio.h>
int main(void) {
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;
/* db configure*/
char *server = "localhost";
char *user = "root";
char *password = "";
char *database = "test";
int port=3314;
conn = mysql_init(NULL);
/* Connect to database */
if (!mysql_real_connect(conn, server,
user, password, database, port, NULL, 0)) {
fprintf(stderr, "connect error: %s\n", mysql_error(conn));
exit(0);
}
/* send SQL query */
if (mysql_query(conn, "select * from ndb_test")) {
fprintf(stderr, "%s\n", mysql_error(conn));
exit(0);
}
res = mysql_use_result(conn);
/* output table name */
printf("MySQL Tables in mysql database:\n");
while ((row = mysql_fetch_row(res)) != NULL)
printf("%s - %s \n", row[0],row[1]);
/* close connection */
mysql_free_result(res);
mysql_close(conn);
return 0;
}
6,用GCC编译程序。在终端中进入“mysql.c”文件所在目录,随后输入:"gcc -o mydbcon -I /usr/include/mysql/ -L /usr/lib/mysql -lmysqlclient mysql.c",如果上述操作无误,我们应该已经编译出来一个叫"mydbcon"的可执行文件了。
7,用"mydbcon"可执行文件验证是否可以使用MySQL C API 了。在终端中键入"mydbcon"可执行文件所在目录,输入:“./mydbcon”,如果现在一切OK,那么我们会看到无错误的提示。很可能出现错误,^_^
错误提示:“error while loading shared libraries: libmysql.so.16 ”。
解决办法:找到“/etc/ld.so.conf”文件,打开它,在文件中添加一行:“/usr/lib/mysql”。输入这行是mysql库文件目录路径,我们把mysql库文件放到了“/usr/lib/mysql”中, 所以 在这里添加这行内容是“/usr/lib/mysql”,如果你放到其它目录中,请用你正确的存放MySQL库路径名。
随后继续执行可执行文件“mydbcon”,还可能会出现错误。
错误提示:Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
解决办法:
1,打开“/etc/my.cnf”文件,在末尾添加:
[mysql]
socket=/var/lib/mysql/mysql.sock”
2,在终端中输入:"ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock"
随后继续执行可执行文件“mydbcon”,这个时候我们应该能够看到没有错误的提示了,和源代码中比较,如果一致,我们的配置就算成功了,现在就可以在GCC中编译用MySQL C API编写的程序了。
8,在Eclipse CDT中使用MySQL C API。在Eclipse的CDT中创建一个C工程,在工程中新建一个C文件,代码和上面一样。随后就是需要设置一下,打开工程的属性,在属性窗体左侧点“C/C++ Build”->"settings",随后在右侧的“tool settings”tab页里进行设置。
a,“GCC C Complier”->"inclues"->"include pathes(l)"中添加一项“/usr/include/mysql”。注意,这个地方是上面那个,不是下面那个。
b,“GCC C Complier”->"Miscellaneous“->"Other flags"中增加“-std=c99”。
c,“GCC C Linker”->"libraries"->"libraries"中增加一项“mysqlclient”。
d,“GCC C Linker”->"libraries"->"librariy search path"中增加一项“/usr/lib/mysql”。
以上各项全部配置完毕后,保存退出配置页面,随后编译,应该没有错误,随后运行编译出来的可执行文件,和GCC编译出来的执行结果一样,我们终于可以在Eclipse CDT中使用MySQL C API了!!!