Ошибка связывания в C и Mysql - PullRequest
0 голосов
/ 27 мая 2011

Привет, я разрабатываю CGI, который написан на C и пытаюсь использовать Mysql Когда я пытаюсь использовать его, я получаю те неопределенные ошибки ссылок для символов, которые начинаются с mysql_, например, показанные здесь:

/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:18: 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+0x192): undefined reference to `mysql_init'
users.c:(.text+0x1e4): undefined reference to `mysql_real_connect'
users.c:(.text+0x1f5): undefined reference to `mysql_error'
users.c:(.text+0x267): undefined reference to `mysql_query'
users.c:(.text+0x278): undefined reference to `mysql_error'
users.c:(.text+0x2ab): undefined reference to `mysql_close'

Итак, я пишу пример кода и могу хорошо работать, когда использую свою программу с этой строкой

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

Хорошо работает.

Итак, следующий шаг, я пытаюсь поместить свою кодировку в CGI. Я все еще получил эти неопределенные ссылки снова. Вот мой Makefile.basic

CC=/usr/bin/gcc
#CC=powerpc-linux-gcc
CP=/usr/bin/cp
CFLAGS = -g -Wall $(mysql_config --cflags) $(mysql_config --libs)

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

Что мне делать? Куда это идет не так? Помоги мне, пожалуйста. Я искал в Интернете в течение недели, но до сих пор не могу найти решение. Я предполагаю, что это в makefile.basic и ссылка на mysql неверна.

Спасибо

Обновление:

вот мой 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

Вот мой 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

Последнее обновление:

Makefile в cgi_module

#set common variant
.SUFFIXES: .c .h .o

ROOT=../../
include $(ROOT)/Makefile.basic

#LINK_NAME = changepass.cgi login.cgi network.cgi reboot.cgi shutdown.cgi
LINK_NAME = login.cgi

INCS = -I../include
INCS += -I../../cgi_src/util/include
OBJES=../../lib/


TARGET = libcgi_module.a
#don't change below
LIB_OBJS = $(patsubst %.c, %.o, $(wildcard *.c))
CLEAN_OBJS = $(LIB_OBJS) $(TARGET)

INST_OBJ = $(TARGET)
%.o: %.c
        $(CC) -c $(CFLAGS) $(INCS) -o $@ $<

all: $(TARGET)

$(TARGET): $(LIB_OBJS)
        $(AR) -vsur $@ $^ 
        @cp $(TARGET) $(OBJES)

clean:
        -@rm -rf $(CLEAN_OBJS)

install:

1 Ответ

1 голос
/ 27 мая 2011

Попробуйте это

CC=/usr/bin/gcc
#CC=powerpc-linux-gcc
CP=/usr/bin/cp
CFLAGS = -g -Wall $(shell mysql_config --cflags) $(shell mysql_config --libs)


foo:
    @echo "CFLAGS are $(CFLAGS)"

и запуск make foo

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