首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • linux下用c如何连接mysql [已结贴,结贴人:zhdsheng]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhdsheng
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 揭帖率:
    发表于:2008-08-20 17:40:44 楼主
    我在linux下连接mysql但是编译不过去。
    代码如下:
    #include <stdlib.h>
    #include <stdio.h>
    #include <mysql/mysql.h>
    #include <syslog.h>

    MYSQL mysql;

    void doQuery()
    {
      MYSQL_ROW m_row;
      MYSQL_RES *m_res;
      char sql[1024];
     
      sprintf(sql,"select count(*) from my_table");
      if(mysql_query(&mysql,sql) != 0)
      {
          fprintf(stderr, "mysql_query err: %s",mysql_error(&mysql));
      }
      m_res = mysql_store_result(&mysql);
      if(m_res==NULL)
      {
          fprintf(stderr, "get result err: %s",mysql_error(&mysql));
      }
      if(m_row = mysql_fetch_row(m_res))
      {
          printf("count(*) is %d!\n",atoi(m_row[0]));
      }
      mysql_free_result(m_res);
    }

    int main()
    {
      char host[32] = "127.0.0.1";
      char user[32] = "2008";
      char passwd[32] = "2008";
      char db[32] = "tra";
       
      if( mysql_init(&mysql) == NULL )
      {
          fprintf(stderr,"Init mysql err!");
          return -1;
      }
      if (mysql_real_connect(&mysql,host,user,passwd,db,0,NULL,0) == NULL)
      {
          fprintf(stderr,"Connect to mysql Error:%s!",mysql_error(&mysql));
          return -1;
      }
      else
      {
          puts("Connect to mysql success!");
      }
         
      doQuery();
      mysql_close(&mysql);
      return 0;
    }


    但是我用命令 gcc -o test test.c 编译时有如下错误:
    test.c:4:25: error: mysql/mysql.h: No such file or directory
    test.c:7: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'mysql'
    test.c: In function 'doQuery':
    test.c:11: error: 'MYSQL_ROW' undeclared (first use in this function)
    test.c:11: error: (Each undeclared identifier is reported only once
    test.c:11: error: for each function it appears in.)
    test.c:11: error: expected ';' before 'm_row'
    test.c:12: error: 'MYSQL_RES' undeclared (first use in this function)
    test.c:12: error: 'm_res' undeclared (first use in this function)
    test.c:16: error: 'mysql' undeclared (first use in this function)
    test.c:25: error: 'm_row' undeclared (first use in this function)
    test.c: In function 'main':
    test.c:39: error: 'mysql' undeclared (first use in this function)
    test.c:39: warning: comparison between pointer and integer
    test.c:44: warning: comparison between pointer and integer
    test.c:57:2: warning: no newline at end of file

    这个是说找不到mysql.h引起的错误吧?
    为什么会有这个错误?如何解决?
    刚刚接触到Linux,请大家多帮忙,谢谢了!
    30  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • january03
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-20 17:49:051楼 得分:0
    你连接串,如果没有问题的话,检查一下数据库的配置,看看数据库是否监听全部的进程?

    曾经我也是连接串没有问题,就是数据库连接不上去,后来检查发现是数据库的配置文件里面的listen  没有监听全部的进程
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhdsheng
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-20 18:27:372楼 得分:0
    谢谢楼上的回复,但是我的现在的问题是编译不过去啊
    test.c:4:25: error: mysql/mysql.h: No such file or directory
    这个问题如何解决?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • shigeng
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-20 21:57:533楼 得分:0
    找不到包含文件mysql/mysql.h,你需要编译时指出他们的路径:
    gcc -o test test.c -I头文件路径
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wlabing
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 08:34:194楼 得分:25
    添加mysql链接库
    gcc -o test test.c -L/usr/include/mysql -lmysqlclient
    如果没记错的话应该是这样写的。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhdsheng
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 09:23:405楼 得分:0
    谢谢楼上的两位帮忙,说的都很对,但是我目前的系统里没有找到mysql.h和mysqlclient 是不是需要安装啊?如何安装?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wlabing
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 09:32:296楼 得分:0
    安装mysql的开发包,可以在mysql官方网站可以下载到。
    这是5.0的社区开发版,还有其他的版本4.X ,5.X , 6.X
    http://dev.mysql.com/downloads/mysql/5.0.html
    你需要装:
    Server包(这是MYSQL的服务器,如果你机器上装了就不用装了)
    Client包(这是MYSQL的客户端,如果你机器上装了就不用装了)
    Headers and libraries包(这个包你应该是没有装的)
    Shared libraries包(这个包你应该也是没有装的)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • nowplaycn
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 09:55:087楼 得分:5
    最好写个Makefile来维护,参考如下:

    C= gcc
    CFLAGS= -c -g -pthread -D_REENTRANT -D`uname -s` -Wall
    LDFLAGS= -g -lpthread
    CDBFLAGS= `mysql_config --cflags`
    LDDBFLAGS = `mysql_config --libs_r`
    target = ex_8_6
    all: $(target)
    target_objects=$(target).o
    $(target) :$(target_objects)
    $(CC) $(LDFLAGS) $(LDDBFLAGS) -o $@ $^
    @echo  $@ Build OK.
    .SUFFIXES:.cpp .o
    .c.o :
    $(CC) $(CFLAGS) $(CDBFLAGS) -o $@ $ <

    clean:
    @rm -rf $(target)  $(target_objects)


    把target 换成你要生成的文件。

    要在多线程的环境下安全使用mysql C 客户端,动态SQL,可以关注我的书 <征服C/C++企业软件开发核心技术>.

    班门弄斧之作已经发行,各大书店有售(http://www.khp.com.cn/books/detail.asp?bookid=1707)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • nowplaycn
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 09:55:228楼 得分:0
    最好写个Makefile来维护,参考如下:

    C= gcc
    CFLAGS= -c -g -pthread -D_REENTRANT -D`uname -s` -Wall
    LDFLAGS= -g -lpthread
    CDBFLAGS= `mysql_config --cflags`
    LDDBFLAGS = `mysql_config --libs_r`
    target = ex_8_6
    all: $(target)
    target_objects=$(target).o
    $(target) :$(target_objects)
    $(CC) $(LDFLAGS) $(LDDBFLAGS) -o $@ $^
    @echo  $@ Build OK.
    .SUFFIXES:.cpp .o
    .c.o :
    $(CC) $(CFLAGS) $(CDBFLAGS) -o $@ $ <

    clean:
    @rm -rf $(target)  $(target_objects)


    把target 换成你要生成的文件。

    要在多线程的环境下安全使用mysql C 客户端,动态SQL,可以关注我的书 <征服C/C++企业软件开发核心技术>.

    班门弄斧之作已经发行,各大书店有售(http://www.khp.com.cn/books/detail.asp?bookid=1707)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhdsheng
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 10:13:399楼 得分:0
    感谢wlabing的关心和帮助,我现在的问题是不想对现有的系统进行改动,因为其他人也要用这个系统,是不是可以找到libmysql.lib把它包含到我的目录下再编译就可以呢(就像VC那样)?我昨天找到了mysql.h头文件把它放到我的目录下了,现在是无法解析mysql.h中的函数.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • linwalker
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 12:54:0410楼 得分:0
    mysqlclient库装上去了之后就应该没有问题了吧
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wlabing
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 13:05:5511楼 得分:0
    你把mysql.h头文件放到了你的目录下,但代码中include时你的代码是#include <mysql/mysql.h>,这样是不会搜索当前目录的,只是搜索标准库目录.你可以修改为#include "mysql.h"试试.有了头文件和库(我不太清楚mysql的库名是不是libmysql.lib),编译应该是可以通过了.你试试吧.
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhdsheng
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 16:23:0412楼 得分:0
    我也不知道mysql的库名是什么,你那里有吗?有的话帮忙发给我一个好吗?我的邮箱是mygod324@163.com.谢谢了。用libmysql.lib编译不通,估计不是这个。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • nowplaycn
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 16:48:4513楼 得分:0
    我晕,linux下的库,动态库是libxxxx.so,静态库是libxxx.a,哪有什么.lib ?

    我给的makefile说的里面很明显,编译的开关是运行命令 mysql_config --cflags 的输出,连接开关是运行 mysql_config --libs_r的输出


    -----------------------------------------------------------
    《征服C/C++企业软件开发核心技术》
    主题词 unix/linux 多线程 网络通讯 数据库 内存排错和性能分析
    http://www.khp.com.cn/books/detail.asp?bookid=1707
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zhdsheng
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-21 17:45:1314楼 得分:0
    nowplaycn,谢谢你,Linux我不太懂,刚刚接触,你说的方法我听不明白,不知道怎么做。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • nowplaycn
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-22 16:41:1615楼 得分:0
    在shell下,运行 mysql_config --cflags  看看输出,这就是编译开关,例如

    $ mysql_config --cflags
    -I'/usr/local/include/mysql'

    运行mysql_config --libs_r,看看输出,这就是连接开关,例如
    $ mysql_config --libs
    -L'/usr/local/lib/mysql' -lmysqlclient -lz -lcrypt -lnsl -lm

    因为我的测试环境不支持mysql客户端的多线程,所以是 mysql_config --libs 而不是 mysql_config --libs_r

    那么,你的编译命令应该就是

    gcc -I'/usr/local/include/mysql' -L'/usr/local/lib/mysql' -lmysqlclient -lz -lcrypt -lnsl -lm -o test test.c

    或者是 gcc `mysql_config --cflags` `mysql_config --libs` -o test test.c

    其中,后面一种形式更为通用


    -----------------------------------------------------------
    《征服C/C++企业软件开发核心技术》
    主题词 unix/linux 多线程 网络通讯 数据库 内存排错和性能分析
    http://www.khp.com.cn/books/detail.asp?bookid=1707
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved