将CGI(C编程)与Mysql链接时出错

| 你好     我正在使用用C和MySql编写的CGI。 这是我的示例页面。
 // save user 
void saveUser(char *name, char *pwd,char *role)
{

    char  query[500];
    memset(query,0,500);
    conn = mysql_init(NULL);

    /* Connect to database */
    if (!mysql_real_connect(conn, server,
    user, password, database, 0, NULL, 0)) {
        fprintf(stderr, \"%s\\n\", mysql_error(conn));
        exit(1);
   }

    /* send SQL query */
    sprintf(query,\"insert into userTbl(name,password,role) values (\\\'%s\\\',\\\'%s\\\',\\\'%s\\\'); \",name,pwd,role);
    if (mysql_query(conn, query)) 
    {
        fprintf(stderr, \"%s\\n\", mysql_error(conn));
        exit(2);
   }

    /* close connection */
    mysql_close(conn);
}
每当将页面放在CGI文件夹中时,都会出现此错误。 未定义对“ mysql_init \”的引用 未定义对“ mysql_connect \”的引用 未定义对“ mysql_select_db \”的引用 和其他与mysql相关的错误。 当我在网上搜索解决方案时 它说我必须像这样将页面链接到mysql客户端库 gcc -o a $(mysql_config --cflags)saveUser.c $(mysql_config --libs) 第一个问题 这是否意味着我不能直接在CGI中使用saveUser.c? 每当我将saveuser.c放在CGI文件夹中时,它都会显示相同的错误。 我只能放一个我创建的脚本。 因此,我决定使用system(\“ a%s%s%s \”,arg [0],arg [1],arg [2]从CGI调用脚本。 然后,我可以保存用户。一切都好。 但是,当我尝试从数据库中检索数据时遇到了另一个问题。 我不知道如何使用生成的脚本从数据库中获取数据。 我必须在我的网站上显示用户列表。 这是我的检索代码。
// get users
void getAll()
{

    char  query[500];
    char result[1024];
    memset(result,0,1024);
    memset(query,0,500);
    conn = mysql_init(NULL);

    /* Connect to database */
    if (!mysql_real_connect(conn, server,
    user, password, database, 0, NULL, 0)) {
        fprintf(stderr, \"%s\\n\", mysql_error(conn));
        exit(1);
   }

    /* send SQL query */
    sprintf(query,\"select * from userTbl\");
    if (mysql_query(conn, query)) 
    {
        fprintf(stderr, \"%s\\n\", mysql_error(conn));
        exit(2);
   }
    res = mysql_use_result(conn);

    /* output table name */
    system(\"clear\");
    sprintf(result,\"ID\\t Name\\t Password\\t Role\\n\");
        while ((row = mysql_fetch_row(res)) != NULL)
    {
         //printf(\"%s \\n\", row[0]);
        //strcpy(id,row[0]);
        sprintf(query,\"%s\\t %s\\t %s\\t\\t %s\\n\",row[0], row[1], row[2], row[3]);
        strcat(result,query);
    }
    /* close connection */
    mysql_free_result(res);
    mysql_close(conn);
    printf(result); 
}
第二个问题 克服此问题的最佳方法是什么。 我可以在CGI中使用脚本吗,还是可以在CGI中直接使用getAll.c。 有人可以帮助我解决我的问题吗? 我只是在1.5个月前学习CGI,而在2.5个月前学习C。 对不起,我很无知。 提前致谢。 更新: 这是我的顶级Makefile
    ROOT=.
     CURDIR=$(shell /bin/pwd)
     JITCOMM_INSTALL=$(ROOT)/install

     include $(ROOT)/Makefile.basic

     #set root directory
     SUB_DIRS = cgi_src
     SUB_DIRS += check_update
     SUB_DIRS += loadconfig
SUB_DIRS += keepalive
SUB_DIRS += script
SUB_DIRS += server
SUB_DIRS += startproxy
SUB_DIRS += net_stats
#SUB_DIRS += ../sniffer_gui
#SUB_DIRS += java 

all:
ifneq ($(SUB_DIRS), )
        @for i in $(SUB_DIRS) ; do if [ ! -d $(CURDIR)/$${i} ]; then continue; fi; \\
        cd $(CURDIR)/$${i}; make || exit; cd $(CURDIR); done
endif

clean:
        @rm -f $(ROOT)/lib/*
        @rm -rf $(JITCOMM_INSTALL)
ifneq ($(SUB_DIRS), )
        @for i in $(SUB_DIRS) ; do if [ ! -d $(CURDIR)/$${i} ]; then continue; fi; \\
        cd $(CURDIR)/$${i}; make clean || exit; cd $(CURDIR); done
endif


install: all
        @rm -rf $(JITCOMM_INSTALL)
        @mkdir $(JITCOMM_INSTALL)
        @mkdir $(JITCOMM_INSTALL)/etc
        @mkdir $(JITCOMM_INSTALL)/etc/acpro
        @mkdir $(JITCOMM_INSTALL)/etc/syslog-ng
        @mkdir $(JITCOMM_INSTALL)/etc/apache2
        @mkdir $(JITCOMM_INSTALL)/etc/apache2/sites-available
        @mkdir $(JITCOMM_INSTALL)/var
        @mkdir $(JITCOMM_INSTALL)/var/www
        @mkdir $(JITCOMM_INSTALL)/var/www/cgi-bin
这是我在cgi-src文件夹中的Makefile
ROOT=../
CURDIR=$(shell /bin/pwd)

include $(ROOT)/Makefile.basic

#set root directory
SUB_DIRS = util
SUB_DIRS += cgi_util
SUB_DIRS += cgi_module

#Must be last
SUB_DIRS += cgi_main

all:
ifneq ($(SUB_DIRS), )
        @for i in $(SUB_DIRS) ; do if [ ! -d $(CURDIR)/$${i} ]; then continue; fi; \\
        cd $(CURDIR)/$${i}; make || exit; cd $(CURDIR); done
endif

clean:
ifneq ($(SUB_DIRS), )
        @for i in $(SUB_DIRS) ; do if [ ! -d $(CURDIR)/$${i} ]; then continue; fi; \\
        cd $(CURDIR)/$${i}; make clean || exit; cd $(CURDIR); done
endif


install:

ifneq ($(SUB_DIRS), )
        @for i in $(SUB_DIRS) ; do if [ ! -d $(CURDIR)/$${i} ]; then continue; fi; \\
        cd $(CURDIR)/$${i}; make install || exit; cd $(CURDIR); done
endif
这是我的Makefile.basic
CC=/usr/bin/gcc
#CC=powerpc-linux-gcc
CP=/usr/bin/cp
CFLAGS=-g -Wall $(shell mysql_config --cflags) $(shell mysql_config --libs)

www=/var/www
htdocs=/htdocs
cgi_bin=/cgi-bin
config=/etc/apache2/sites-available/default


INSTALL_DIR=$(pwd)/.install
这是我的错误的一部分
 /usr/bin/gcc -c -g -Wall -I/usr/include/mysql  -DBIG_JOINS=1 -fPIC fno-strict- aliasing -Wl,-Bsymbolic-functions -rdynamic -L/usr/lib/mysql -lmysqlclient -I../include -o cgi_func.o cgi_func.c
 /usr/bin/gcc -c -g -Wall -I/usr/include/mysql  -DBIG_JOINS=1 -fPIC -fno-strict-aliasing -Wl,-Bsymbolic-functions -rdynamic -L/usr/lib/mysql -lmysqlclient -I../include -o cgic.o cgic.c
 /usr/bin/gcc -g -Wall -I/usr/include/mysql  -DBIG_JOINS=1 -fPIC -fno-strict-aliasing -Wl,-Bsymbolic-functions -rdynamic -L/usr/lib/mysql -lmysqlclient -static -o cgi_main  cgi_func.o  cgic.o -lcgi_util -lcgi_module -lutil -L../../lib -lm
 ../../lib/libcgi_module.a(users.o):(.data.rel.local+0x8): multiple definition of `password\'
 ../../lib/libcgi_module.a(password.o):/home/jitcomm/intern_GUI/jit24_test_v2/cgi_src/cgi_module/password.c:292: first defined here
 /usr/bin/ld: Warning: size of symbol `password\' changed from 193 in ../../lib     /libcgi_module.a(password.o) to 4 in ../../lib/libcgi_module.a(users.o)
 /usr/bin/ld: Warning: type of symbol `password\' changed from 2 to 1 in ../../lib/libcgi_module.a(users.o)
 ../../lib/libcgi_module.a(users.o): In function `save\':
 /home/jitcomm/intern_GUI/jit24_test_v2/cgi_src/cgi_module/users.c:17: multiple definition of `save\'
 ../../lib/libcgi_module.a(mode.o):/home/jitcomm/intern_GUI/jit24_test_v2/cgi_src/cgi_module/mode.c:56: first defined here
 ../../lib/libcgi_module.a(users.o): In function `saveUser\':
 users.c:(.text+0x1cb): undefined reference to `mysql_init\'
 users.c:(.text+0x22d): undefined reference to `mysql_real_connect\'
 users.c:(.text+0x241): undefined reference to `mysql_error\'
 users.c:(.text+0x2bd): undefined reference to `mysql_query\'
 users.c:(.text+0x2d1): undefined reference to `mysql_error\'
 users.c:(.text+0x30d): undefined reference to `mysql_close\'
    
已邀请:
您已经回答了自己的问题,如果您获得对MySQL的未定义引用,则说明链接不正确。您需要使用以下代码进行编译:
gcc -o a $(mysql_config --cflags) saveUser.c $(mysql_config --libs)
这与代码的外观/工作方式无关,而与编译器/链接器如何将源文件组合为可执行文件无关。如果您发布Makefile的一部分而不是代码,则可能会获得更多有关此问题的指针。 编辑:好的,可以在Makefile.basic的CFLAGS声明中添加
$(mysql_config --cflags) $(mysql_config --libs)
并查看会发生什么吗? EDIT2:导致错误的行似乎是:
 /usr/bin/gcc -g -Wall -I/usr/include/mysql  -DBIG_JOINS=1 -fPIC -fno-strict-aliasing -Wl,-Bsymbolic-functions -rdynamic -L/usr/lib/mysql -lmysqlclient -static -o cgi_main  cgi_func.o  cgic.o -lcgi_util -lcgi_module -lutil -L../../lib -lm
有点奇怪,因为(我假设)链接了正确的库(
-lmysqlclient
)...请仔细检查您没有安装多个版本的mysql库,或者这些函数是在其他库中定义的。最简单的方法是仅使用这些mysql函数创建一个最小的项目,然后尝试链接它。如果那不起作用,那是您的问题。如果可以,我不确定下一步要去哪里。 您应该顺便查看这些多个定义警告,看起来很讨厌...检查是否在某处的头文件中定义了全局变量。您正在处理的项目似乎将所有代码分区在不同的库中,并在最后链接这些代码,也许您需要清除所有代码(删除.o和.a文件)并再次运行make?     

要回复问题请先登录注册