Ошибка при соединении CGI (C программирования) с Mysql - PullRequest
1 голос
/ 26 мая 2011

Привет, я использую CGI, который написан на C и MySql.

Вот мой пример страницы.

 // 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 -oa $ (mysql_config --cflags) saveUser.c $ (mysql_config --libs)

Первый вопрос Значит ли это, что я не могу напрямую использовать saveUser.c в CGI?

Он показывает ту же ошибку, когда я помещаю saveuser.c в папку CGI.Я могу только поставить скрипт , который я создал.Поэтому я решил вызвать сценарий из CGI, используя system ("a% s% s% s", arg [0], arg [1], arg [2]) Тогда я могу сохранить пользователя.Все в порядке.

Но у меня возникла другая проблема, когда я пытался извлечь данные из базы данных.Я не знаю, как получить данные из базы данных, используя сгенерированный скрипт.Я должен показать списки пользователей на моем веб-сайте.Вот мой код для поиска.

// 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 или Как я могу напрямую использовать getAll.c в моем CGI.

Кто-нибудь может мне помочь с моей проблемой?Я только изучаю CGI 1,5 месяца назад и C всего 2,5 месяца назад.Извините за невежество

    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

Вот мой Makefile в папке cgi-src

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'

1 Ответ

2 голосов
/ 26 мая 2011

Вы ответили на свой вопрос, если вы получаете неопределенные ссылки на MySQL, вы не связываете его правильно.Вам нужно скомпилировать с:

gcc -o a $(mysql_config --cflags) saveUser.c $(mysql_config --libs)

Это не имеет ничего общего с тем, как ваш код выглядит / работает, только с тем, как компилятор / компоновщик объединяет исходные файлы в исполняемый файл.Если вы разместите часть своего файла Makefile вместо кода, возможно, вы сможете получить больше указателей по этому вопросу.

РЕДАКТИРОВАТЬ: Хорошо, вы можете добавить $(mysql_config --cflags) $(mysql_config --libs) в декларацию CFLAGS в Makefile.basic и посмотреть, что произойдет?

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) ... doubleубедитесь, что у вас не установлено несколько версий библиотеки mysql или что эти функции определены в другой библиотеке.Самый простой способ сделать это - создать минимальный проект только с этими функциями mysql и попытаться связать его.Если это не сработает, есть ваша проблема.Если это сработает, я не уверен, куда идти дальше.

Кстати, вы должны взглянуть на эти предупреждения о нескольких определениях, выглядит неприятно ... проверьте, есть ли у вас глобальные переменные, определенные в заголовочном файле.Похоже, проект, над которым вы работаете, разбивает весь свой код на разные библиотеки и в конце связывает их, может быть, вам нужно очистить его (удалить файлы .o и .a) и снова запустить make?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...