(转载)http://blog.chinaunix.net/uid-21347250-id-1827705.html
在用源码安装mysql的情况下,源码将所有的都装了,包括mysql-server mysql-client mysql-dev mysql-debuge 等待。所以源码包会特别大,有100多M。
而用rpm 包安装时,一般都没有安装debuge这个包。
下面描述如何编译mysql C 的程序:
-I include的路径。即欲链接到不在系统黑夜库下面的头文件时,需要将该路径包含进来。
-L 库文件的路径。增加一个 -l 选项中库文件的查询路径,该路径下包含许多库文件,可供搜索。
-l 库名。将与某个库文件链接,该库文件除了在系统默认的lib库文件夹下查找外,还将在 -L参数后跟着的库文件名下查找。
编译程序时,分为汇编及链接。汇编即将头文件展开。链接则根据系统的动态链接库,链接并生成可执行文件。
******************************
写了个连接mysql的main.c
使用gcc -I/usr/local/mysql/include -L/usr/local/mysql/lib -lmysqlclient -o main.o main.c编译时出错:
不能找到文件mysqlclient
gcc -I/usr/local/mysql/include -L/usr/local/mysql/lib -lmysqlclient -lz -lcrypt -lnsl -lm -lmygcc -o main.o main.c
可能你会注意到:/usr/local/mysql/lib的文件是以libmysql开头的文件,这是动态链接库的命名规则,以lib开头,以.so结尾。如果你用 -llibmysqlclient的话,那无将出错,找不到libmysqlclient这个文件,事实上,它是名为mysqlclient的动态链接库。
几番周折,终于编译成功。但是,在运行时,还是找不到动态链接库。运行时,因为程序是动态链接的啊,所以,它将去找(lib)mysqlclient.so.16这个链接库,可是,在系统的默认链接库文件夹里头,是没有这个文件的。所以,系统有另外一个变量LD_LIBRARY_PATH,专门用来设置链接库夹的路径。如:
export LD_LIBRARY_PATH=$MYSQL/lib:$LD_LIBRARY_PATH
有了这个变量后,在运行时,就不会有找不到链接库mysqlclient.so.16这个错误了。
但是,以下的代码在运行时,出现了段错误。这其中是什么原因我也不清楚了。真麻烦也。所以,干脆直接把mysql给删了,换个rpm安装更快.
|
rpm没有下载下来。执行时出现段错误。这是程序的问题,而不是环境的问题。重新审视下自己,不可推搪的错误。调试是不行的了,至少我现在还不懂。
段错误,又发生在函数调用(mysql_real_connect)上,肯定是引用了非法指针。最大的可能就是mysql了。
mysql_init(mysql);改为mysql = mysql_init(mysql);
这样就可以了!为什么呢?显得,返回的MYSQL*是调用mysql_init()后新创建的对象的地址。
25.2.3.35. mysql_init()
MYSQL *mysql_init(MYSQL *mysql)
描述
分配或初始化与mysql_real_connect()相适应的MYSQL对象。如果mysql是NULL指针,该函数将分配、初始化、并返回新对象。否则,将初始化对象,并返回对象的地址。如果mysql_init()分配了新的对象,当调用mysql_close()来关闭连接时。将释放该对象。
这里,就是属于向mysql_init()传递了个null,因为MYSQL* mysql只是声明个指针,该指针是空着的。
注意:笔者采取的是源码安装,mysql.h头文件在/usr/local/mysql/include/,mysqlclient库文件在/usr/local/mysql/lib/。
在.bash_profile添加: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/mysql/lib mysql.c文件内容: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <dirent.h> #include "/usr/local/mysql/include/mysql.h" const char* host = "127.0.0.1"; MYSQL* mysql; MYSQL_RES* res; MYSQL_ROW* row; const char* user = "root"; const char* password = ""; int main(int argc ,char **argv) { int t, r; mysql = mysql_init(mysql); //mysql = mysql_real_connect(mysql, host, user, NULL, "mysql", 0, NULL, 0); //mysql = mysql_real_connect(mysql, host, user, password, "mysql", 0, NULL, 0); mysql = mysql_real_connect(mysql, host, user, password, "test", 0, NULL, 0); // 这里使用MySQL默认数据库test if (!mysql) { perror("MySQL connect error!\n"); return EXIT_FAILURE; } // 查询test数据库中的student表 if (mysql_query(mysql, "select * from student")) { perror("MySQL query error!\n"); return EXIT_FAILURE; } else { res = mysql_use_result(mysql); if (res) { for (r = 0; r <= mysql_field_count(mysql); r++) {
// 每次读取一个元组(一行),知道row为NULL if ((row = mysql_fetch_row(res)) == NULL) break;
// 输出一个元组的所有字段值 for (t = 0; t < mysql_num_fields(res); t++) printf("%s ", row[t]); printf("\n"); } } mysql_free_result(res); // 释放结果集 }
// 关闭MySQL连接 mysql_close(mysql); return 0; }
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
+--------------------+
4 rows in set (0.14 sec)mysql> use test;
Database changed
mysql> insert into student values(23, 'Jack'), (29, 'Mike'), (12, 'Lili');
Query OK, 3 rows affected (0.11 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from student;
+------+------+
| Id | name |
+------+------+
| 23 | Jack |
| 29 | Mike |
| 12 | Lili |
+------+------+
3 rows in set (0.07 sec)
mysql>
[root@localhost ~]# gcc mysql.c -I/usr/local/mysql/include -L/usr/local/mysql/lib -lmysqlclient mysql.c
[root@localhost ~]# ./a.out
23 Jack
29 Mike
12 Lili
[root@localhost ~]#