Linux下MySQL编程

(转载)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安装更快.


#include <mysql.h>
#include <stdio.h>
#include <stdlib.h>

const char * host = "127.0.0.1";
MYSQL * mysql;
const char * user = "root";
const char * password = "";

int main(){

    mysql_init(mysql);

    mysql = mysql_real_connect(mysql,host,user,password,"mysql",0,NULL,0);

    if(!mysql){
            printf("connect error!\n");
            return EXIT_FAILURE;
    }



    return 0;
}


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 ~]#

 

 

 

posted @ 2013-04-28 21:59  robotke1  阅读(623)  评论(0编辑  收藏  举报