gtk+ make 오류

hiscom의 이미지

glade로 위젯을 생성하고 시그널 등록해서 src/callbacks.c를 열어 시그널함수부분에 mysql 쿼리문을 작성 했습니다.

autogen.sh를 실행한니까 Makefile이 생기더군요.
열어서
PACKAGE_CFLAGS 에 -I/usr/include/mysql
PACKAGE_LIBS 에 -L/usr/lib/mysql -lmysqlclient
이렇게 추가 했습니다. // FC4 의 mysql 라이브러리 기본경로

make를 하니 다음처럼 오류가 생기네요.

undefined reference to 'mysql_real_connect' ....
mysql 함수 부분이 전부 그래요.

혹시나 해서 /usr/lib/include/모든파일 /usr/include/모든파일 을 카피해서 했는데도 마찬가지군요... ㅜㅜ

분명히 mysql.h에 함수 원형이 있는데 이상하네요.

참고로 텍스트기반에서는 잘 컴파일 됩니다.
gcc test.c -o test.c -I/usr/include/mysql -L/usr/lib/mysql -lmysqlclient

File attachments: 
첨부파일 크기
Plain text icon Makefile.txt19.87 KB
hiscom의 이미지

저와 비슷한 상황 같은데요... 함 봐주세요.

-- 질문 --

Quote:

Respected Sir,
Some engineering students of SMIT undergoing project work in our organization faced some problems while
working in RedHat8 Linux environment.

They are trying to develop an application program using GLADE as the front-end tool and MYSQL 3.23 as
the back-end in the platform RED HAT 8.1. They are using C for coding.
When they are trying to run the C code in the ?callbacks.c? file and try to compile it from GLADE to connect
MYSQL using the <make> command the following error msgs are displayed:-

[EMAIL PROTECTED] project1]# make
cd . && /bin/sh /root/Projects/project1/missing --run autoheader
WARNING: Using auxiliary files such as `acconfig.h', `config.h.bot'
WARNING: and `config.h.top', to define templates for `config.h.in'
WARNING: is deprecated and discouraged.

WARNING: Using the third argument of `AC_DEFINE' and
WARNING: `AC_DEFINE_UNQUOTED' allows to define a template without
WARNING: `acconfig.h':

WARNING: AC_DEFINE([NEED_MAIN], 1,
WARNING: [Define if a function `main' is needed.])
WARNING: More sophisticated templates can also be produced, see the
WARNING: documentation.
autoheader: `config.h.in' is unchanged
touch ./config.h.in
cd . && /bin/sh ./config.status config.h
config.status: creating config.h
config.status: config.h is unchanged
make all-recursive
make[1]: Entering directory `/root/Projects/project1'
Making all in src
make[2]: Entering directory `/root/Projects/project1/src'
source='callbacks.c' object='callbacks.o' libtool=no \
depfile='.deps/callbacks.Po' tmpdepfile='.deps/callbacks.TPo' \
depmode=gcc3 /bin/sh ../depcomp \
gcc -DHAVE_CONFIG_H -I. -I. -I.. -DPACKAGE_DATA_DIR=\""/usr/local/share"\"
-DPACKAGE_LOCALE_DIR=\""/usr/local/share/locale"\" -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include
-I/usr/include/atk-1.0 -I/usr/include/pango-1.0 -I/usr/include/Xft2 -I/usr/include/freetype2
-I/usr/X11R6/include -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -g -O2 -Wall -c `test -f 'callbacks.c' ||
echo './'`callbacks.c
callbacks.c: In function `on_button1_clicked':
callbacks.c:48: warning: `return' with a value, in function returning void
callbacks.c:51: warning: `return' with a value, in function returning void
callbacks.c:59: warning: `return' with a value, in function returning void
callbacks.c:62:2: warning: no newline at end of file
gcc -g -O2 -Wall -o project1 main.o support.o interface.o callbacks.o -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0
-lgdk_pixbuf-2.0 -lm -lpangoxft-1.0 -lpangox-1.0 -lpango-1.0 -lgobject-2.0 -lgmodule-2.0 -ldl -lglib-2.0
callbacks.o: In function `on_button1_clicked':
/root/Projects/project1/src/callbacks.c:35: undefined reference to `mysql_init'
/root/Projects/project1/src/callbacks.c:36: undefined reference to `mysql_real_connect'
/root/Projects/project1/src/callbacks.c:50: undefined reference to `mysql_query'
/root/Projects/project1/src/callbacks.c:54: undefined reference to `mysql_store_result'
/root/Projects/project1/src/callbacks.c:56: undefined reference to `mysql_free_result'
/root/Projects/project1/src/callbacks.c:58: undefined reference to `mysql_close'
collect2: ld returned 1 exit status
make[2]: *** [project1] Error 1
make[2]: Leaving directory `/root/Projects/project1/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/root/Projects/project1'
make: *** [all] Error 2

But when they are compiling the same code from outside of GLADE using the following command < gcc
conn.c -L /usr/lib/mysql -lmysqlclient -lz>, there is no compilation error.

The following is the code of the file ?conn.c? which they have used.

/*Here is an example C program taken from the mySQL book. named conn.c*/
#include "/usr/include/mysql/mysql.h"
#include "/usr/include/stdio.h"
#include "/usr/include/assert.h"
#include "/usr/include/stdlib.h"
#include "/usr/include/string.h"

char sql_command[2048];

int main()
{
MYSQL_RES *result;
MYSQL *connection, mysql;
int state;
// printf("we did it...hopefully\n");
sprintf(sql_command,"select * from stud");
// connect to the mySQL database at localhost
mysql_init(&mysql);
connection = mysql_real_connect(&mysql,
NULL, /*IP, server name, or
localhost, or just NULL
for localhost*/
NULL, /*user name*/
NULL, /*password*/
"payal", /*db name*/
0, /*port number*/
NULL, /*Unix socket name:
an addition of 3.23?*/
0); /*client_flag*/
// check for a connection error
if (connection ==NULL) return 0;
printf("con\n");
state = mysql_query(connection, sql_command);
if (state!=0) return 0;
// must call mysql_store_result() before we can issue any other
// query calls
result = mysql_store_result(connection);
// free the result set
mysql_free_result(result);
// close the connection
mysql_close(connection);
return 0;
}

So, for successful compilation of the code from GLADE, do they require to make certain changes in the
?make? file?
It would be very much kind of you if you could have suggest something to solve the problem in any way.

Warm regards,

-- 답변 --

Quote:

On Monday 24 Feb 2003 13:35, santanu sinha wrote:
> guys,
> help me out on this.
> Dr. Susanta Sen of our instiute fwd. me this message.
> Send any help avialable to me.
> -santanu

Hi ,
Is miss Payal Kundu works there because the problem seems to very similar to
Payal Kundu's Problem.

First thing is that that #include <mysql/mysql.h> is needed & also have to
edit the make files so the generated program get linked with Mysql API.

The easier way is use GNOME DB which is wrapper code on the MySQL API to
access it from GTK.


Anirban Biswas.

몇시간째 해매고 있습니다.
도와 주세요.

nohmad의 이미지

컴파일은 되는데 링킹이 실패하는 거군요. 즉 헤더에는 함수 선언이 있으므로 컴파일은 되는데, 실제 라이브러리에는 함수가 없어서 링킹을 못하는 상황이라고 의심됩니다. 일단은 헤더와 라이브러리의 버전이 일치하는지 확인해봐야 할 것 같습니다.

$ nm -D /usr/lib/mysqlclient.so | grep mysql_real_connect

해보십시요.

hiscom의 이미지

해 보았습니다.

[hiscom@localhost]$nm -D /usr/lib/mysql/libmysqlclient.so | grep mysql_real_connect
00c07b24 T mysql_real_connect
[hiscom@localhost]$

결과가 이렇군요.

mithrandir의 이미지

실제로 빌드될때 -lmysqlclient가 ld혹은 gcc옵션으로 들어가는지 확인해보세요.

언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net

hys545의 이미지

mithrandir wrote:
실제로 빌드될때 -lmysqlclient가 ld혹은 gcc옵션으로 들어가는지 확인해보세요.

한번 그부분만 수동으로 해보세여
gcc xxxx -lmysqlclient이런식으로

즐린

hiscom의 이미지

실제 빌드시 포함 되질 않는군요.

-I/usr/include/mysql
-L/usr/lib/mysql
-lmysqlclient

세개의 옵션이 하나도 들어가질 않는군요..ㅜㅜ

Make 파일에 대해선 거의 장님이에요...

configure 해 보아도 되질 않아요..

시간되시면 첨부된 파일좀 봐주세요. 어디에 sql라이브러리 경로를 삽입해야 될지???

GTK+ 재미 붙였다가 완존히 탈진했네요. ^^;

댓글 첨부 파일: 
첨부파일 크기
Plain text icon 0바이트
nohmad의 이미지

제가 glade를 잘 몰라서 질문을 제대로 이해하지 못했습니다. 알고보니 autogen.sh란 게 glade가 자동으로 생성해주는 파일이군요. 한가지 알아두셔야 할 것은 glade는 인터페이스 빌드 도구일 뿐, 다른 상업적인 IDE에 포함된 인터페이스 디자이너 류처럼 사용자 로직과 통합되도록 사용하기는 힘들다는 점입니다.

glade는 인터페이스 외에는 사용자 프로그램에 대해 아무것도 알지 못하기 때문에, glade가 생성해준 소스(callbacks.[ch], interface.[ch], support.[ch])를 재사용하려면, src/Makefile.am에 필요한 라이브러리와 헤더 경로를 수동으로 포함시켜주면 될 것 같습니다. .am 파일은 원래 수동으로 작성하는 것이라 glade가 덮어쓰지 않습니다. INCLUDES와 xxx_LDADD 부분을 보세요.

그런데 사실 glade가 소스 자동 빌드를 지원하는 C/C++/Ada 등의 언어로 프로그램을 작성하더라도 glade가 생성한 골격(skeleton) 위에다 직접 구현하는 방식보다는 libglade를 이용하는 것이 좋습니다. 실제로 glade 자체에서도 이 방식을 추천하고 있습니다(프로젝트 옵션 메뉴의 C 옵션 항목을 보면, "Note: for large applications the use of libglade is recommended"라는 문구를 볼 수 있습니다). 여기서 libglade를 이용한다는 것은 glade 프로그램에서 디자인한 인터페이스에 대한 내용을 xml 형식으로 담고 있는 *.glade 파일을 이용한다는 얘기입니다. 다시 .glade 파일을 이용한다는 것은 프로그램 소스 안에 인터페이스 생성에 대한 부분이 정적으로 들어있는 것이 아니라, gtk 프로그램이 실행 중에 libglade를 통해 이 xml 파일을 해석해서 인터페이스를 빌드한다는 말입니다.

아무래도 프로그램 규모가 커지면, glade가 생성해준 골격 내에서 작업하는 것이 매우 답답하고, 비효율적으로 되기 쉬운데, libglade를 이용할 경우 인터페이스를 완전히 별개의 모듈로 생각할 수 있기 때문에 장점이 있습니다. .glade 포맷은 플랫폼/언어 독립적인 데다, 재사용성도 높기 때문에, 인터페이스의 복잡성이 커져도 실제 사용자 로직에 거의 영향을 주지 않으므로, 한 번 이 방식에 익숙해지는 것이 여러모로 좋다고 생각합니다. 그리고 이렇게 하는 것이 작은 작업들이 유기적으로 결합되서 전체 환경을 구성해가는 gnome/gtk의 철학에도 맞는 것 같습니다.

처음 질문 내용에서 많이 벗어났는데, 어쨌든 glade가 생성한 Makefile을 수정하지 말고, 직접 autotools를 이용해서 빌드 환경을 새로 만드는 것이 좋을 것 같습니다. 물론 autotools 매뉴얼은 읽어보셔야겠죠. 한국어 번역도 꽤 잘 되어 있습니다.

http://wiki.kldp.org/wiki.php/DocbookSgml/Autotools-KLDP http://gnome.or.kr/wiki/TheGnomeBuildEnvironment

hiscom의 이미지

좋은 지적 감사합니다.
소름이 쫙 돋네요. ^^ 너무 삽질했거든요...
다시 힘내서 할께요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.