claus_s
19-05-2006, 13:19
Hallo!
Ich habe mich gestern an die Autotools gewagt. Ich bin ja eigentlich kein Programmierer; es ist mehr ein Hobby. Verzeiht also, wenn ich gleich etwas furchtbar offensichtliches frage.
Der Anlass war: Ich habe ein Paket gefunden, daß nur ein Makefile benutzt.
Das sah nach einer guten Einstiegsübung aus. Wesentlicher Punkt im Makefile:
CC=gcc
CFLAGS=-Wall `pkg-config --cflags gtk+-2.0`
LIBS=`pkg-config --libs gtk+-2.0`
bindir ?= /usr/bin
mandir ?= /usr/share/man
.c.o:
$(CC) -c $(CFLAGS) $(CPPFLAGS) $<
g3data: main.o sort.o points.o drawing.o
$(CC) $(CFLAGS) -o g3data main.o sort.o points.o drawing.o $(LIBS)
strip g3data
main.o: main.c main.h strings.h
sort.o: sort.c main.h
points.o: points.c main.h
drawing.o: drawing.c main.h
Nun habe ich das in folgendes Makefile.am übersetzt:
INCLUDES = @GTK_CFLAGS@
LDADD = @GTK_LIBS@
CLEANFILES = *~
DISTCLEANFILES = .deps/*.P
bin_PROGRAMS = g3data
g3data_SOURCES = sort.c \
points.c \
drawing.c
EXTRA_DIST = main.h \
strings.h
Die Objektdateien werden auch erzeugt, nur leider linkt "make" am Ende nicht -- die Fehlermeldung beginnt mit:
gcc -g -O2 -o g3data sort.o points.o drawing.o -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lfontconfig -lXinerama -lXi -lXrandr -lXext -lXcursor -lXfixes -lpango-1.0 -lcairo -lXrender -lX11 -lgobject-2.0 -lgmodule-2.0 -ldl -lglib-2.0
/usr/lib/gcc/i486-linux-gnu/4.0.2/../../../../lib/crt1.o: In function `_start':
../sysdeps/i386/elf/start.S:115: undefined reference to `main'
points.o: In function `CalcPointValue':
~/Desktop/work_dir/g3data-1.5.0/src/points.c:82: undefined reference to `axiscoords'
Da kommen noch einige andere Variable, die ihm Probleme bereiten. Aber alle sind in points.c definiert:
/* Extern variables */
extern gint axiscoords[MAXNUMTABS][4][2];
extern gdouble realcoords[MAXNUMTABS][4];
extern gboolean logxy[MAXNUMTABS][2];
Wie man sieht: Alles Typen aus GTK+ Bibliothek, und GTK+ ist im Aufruf für den Linker enthalten.
Was habe ich übersehen?
Ich habe mich gestern an die Autotools gewagt. Ich bin ja eigentlich kein Programmierer; es ist mehr ein Hobby. Verzeiht also, wenn ich gleich etwas furchtbar offensichtliches frage.
Der Anlass war: Ich habe ein Paket gefunden, daß nur ein Makefile benutzt.
Das sah nach einer guten Einstiegsübung aus. Wesentlicher Punkt im Makefile:
CC=gcc
CFLAGS=-Wall `pkg-config --cflags gtk+-2.0`
LIBS=`pkg-config --libs gtk+-2.0`
bindir ?= /usr/bin
mandir ?= /usr/share/man
.c.o:
$(CC) -c $(CFLAGS) $(CPPFLAGS) $<
g3data: main.o sort.o points.o drawing.o
$(CC) $(CFLAGS) -o g3data main.o sort.o points.o drawing.o $(LIBS)
strip g3data
main.o: main.c main.h strings.h
sort.o: sort.c main.h
points.o: points.c main.h
drawing.o: drawing.c main.h
Nun habe ich das in folgendes Makefile.am übersetzt:
INCLUDES = @GTK_CFLAGS@
LDADD = @GTK_LIBS@
CLEANFILES = *~
DISTCLEANFILES = .deps/*.P
bin_PROGRAMS = g3data
g3data_SOURCES = sort.c \
points.c \
drawing.c
EXTRA_DIST = main.h \
strings.h
Die Objektdateien werden auch erzeugt, nur leider linkt "make" am Ende nicht -- die Fehlermeldung beginnt mit:
gcc -g -O2 -o g3data sort.o points.o drawing.o -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lfontconfig -lXinerama -lXi -lXrandr -lXext -lXcursor -lXfixes -lpango-1.0 -lcairo -lXrender -lX11 -lgobject-2.0 -lgmodule-2.0 -ldl -lglib-2.0
/usr/lib/gcc/i486-linux-gnu/4.0.2/../../../../lib/crt1.o: In function `_start':
../sysdeps/i386/elf/start.S:115: undefined reference to `main'
points.o: In function `CalcPointValue':
~/Desktop/work_dir/g3data-1.5.0/src/points.c:82: undefined reference to `axiscoords'
Da kommen noch einige andere Variable, die ihm Probleme bereiten. Aber alle sind in points.c definiert:
/* Extern variables */
extern gint axiscoords[MAXNUMTABS][4][2];
extern gdouble realcoords[MAXNUMTABS][4];
extern gboolean logxy[MAXNUMTABS][2];
Wie man sieht: Alles Typen aus GTK+ Bibliothek, und GTK+ ist im Aufruf für den Linker enthalten.
Was habe ich übersehen?