ubuntuusers.de

Kompilieren von metapixel funktioniert nicht

Status: Gelöst | Ubuntu-Version: Ubuntu 12.04 (Precise Pangolin)
Antworten |

Jonius Team-Icon

Ikhayateam
Avatar von Jonius

Anmeldungsdatum:
21. August 2009

Beiträge: 1861

Wohnort: München

Ich möchte für eine konkrete Anwendung das Programm metapixel anpassen. Allerdings scheitere ich bereits daran den Quelltext unverändert zu kompilieren. Es kommt zu folgender Fehlermeldung, wenn ich make ausführe:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
$ make
make -C rwimg
make[1]: Betrete Verzeichnis '/home/jonatan/.Programmierumgebung/C/metapixel/rwimg'
make[1]: Für das Ziel »all« ist nichts zu tun.
make[1]: Verlasse Verzeichnis '/home/jonatan/.Programmierumgebung/C/metapixel/rwimg'
make -C lispreader
make[1]: Betrete Verzeichnis '/home/jonatan/.Programmierumgebung/C/metapixel/lispreader'
make[1]: Für das Ziel »all« ist nichts zu tun.
make[1]: Verlasse Verzeichnis '/home/jonatan/.Programmierumgebung/C/metapixel/lispreader'
gcc  -L/usr/X11R6/lib  -g `pkg-config --libs glib-2.0` -o metapixel main.o bitmap.o color.o metric.o matcher.o tiling.o metapixel.o library.o classic.o collage.o search.o utils.o error.o zoom.o getopt.o getopt1.o rwimg/librwimg.a lispreader/liblispreader.a -lpng -ljpeg -lgif  -lm -lz
main.o: In function `main':
/home/jonatan/.Programmierumgebung/C/metapixel/main.c:701: undefined reference to `g_strsplit'
/home/jonatan/.Programmierumgebung/C/metapixel/main.c:711: undefined reference to `g_ascii_strtod'
/home/jonatan/.Programmierumgebung/C/metapixel/main.c:713: undefined reference to `g_strfreev'
lispreader/liblispreader.a(lispreader.o): In function `lisp_read_with_allocator':
/home/jonatan/.Programmierumgebung/C/metapixel/lispreader/lispreader.c:514: undefined reference to `g_ascii_strtod'
lispreader/liblispreader.a(lispreader.o): In function `lisp_print_real':
/home/jonatan/.Programmierumgebung/C/metapixel/lispreader/lispreader.c:1059: undefined reference to `g_ascii_formatd'
collect2: ld gab 1 als Ende-Status zurück
make: *** [metapixel] Fehler 1

Zum Nachvollziehen, was ich gemacht habe:

1
2
3
4
$ git clone git://github.com/schani/metapixel.git
$ cd metapixel
$ git submodule init
$ git submodule update

Soweit gab es keine Fehler. Ich habe dann noch im Makefile die Compileroption -fnested-functions entfernt, weil diese zu Problemen geführt hat. Nun bekomme ich die oben genannte Fehlermeldung beim Ausführen von make. Hat jemand eine Idee, woran das liegen könnte?

radoe2

Anmeldungsdatum:
30. November 2006

Beiträge: 243

Jonius schrieb:

Ich möchte für eine konkrete Anwendung das Programm metapixel anpassen. Allerdings scheitere ich bereits daran den Quelltext unverändert zu kompilieren. Es kommt zu folgender Fehlermeldung, wenn ich make ausführe:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
....
gcc  -L/usr/X11R6/lib  -g `pkg-config --libs glib-2.0` -o metapixel main.o bitmap.o color.o metric.o matcher.o tiling.o metapixel.o library.o classic.o collage.o search.o utils.o error.o zoom.o getopt.o getopt1.o rwimg/librwimg.a lispreader/liblispreader.a -lpng -ljpeg -lgif  -lm -lz
main.o: In function `main':
/home/jonatan/.Programmierumgebung/C/metapixel/main.c:701: undefined reference to `g_strsplit'
/home/jonatan/.Programmierumgebung/C/metapixel/main.c:711: undefined reference to `g_ascii_strtod'
/home/jonatan/.Programmierumgebung/C/metapixel/main.c:713: undefined reference to `g_strfreev'
lispreader/liblispreader.a(lispreader.o): In function `lisp_read_with_allocator':
/home/jonatan/.Programmierumgebung/C/metapixel/lispreader/lispreader.c:514: undefined reference to `g_ascii_strtod'
lispreader/liblispreader.a(lispreader.o): In function `lisp_print_real':
/home/jonatan/.Programmierumgebung/C/metapixel/lispreader/lispreader.c:1059: undefined reference to `g_ascii_formatd'
collect2: ld gab 1 als Ende-Status zurück
make: *** [metapixel] Fehler 1

Das sind Linkerfehler, die angemeckerten Funktionen stammen alle aus der GLIB. Hast du das Paket libglib2.0-dev installiert?

Jonius Team-Icon

Ikhayateam
(Themenstarter)
Avatar von Jonius

Anmeldungsdatum:
21. August 2009

Beiträge: 1861

Wohnort: München

radoe2 schrieb:

Das sind Linkerfehler, die angemeckerten Funktionen stammen alle aus der GLIB. Hast du das Paket libglib2.0-dev installiert?

Das Paket ist installiert. Hier auch die Bestätigung:

1
2
$ pkg-config --cflags glib-2.0
-I/usr/include/glib-2.0 -I/usr/lib/i386-linux-gnu/glib-2.0/include 

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2505

Schuss ins Blaue:

https://wiki.ubuntu.com/NattyNarwhal/ToolchainTransition

Sprich, mal versuchen, den Call zu „pkg-config“ ans Ende zu setzen.

gcc  -L/usr/X11R6/lib -g  -o metapixel main.o bitmap.o color.o ... `pkg-config --libs glib-2.0`

Keine Garantie. Ist nur das erste, was mir da in den Sinn kommt.

Vielleicht ist deine GLib-Version auch zu alt oder zu neu, um die Versionen da zu beinhalten. Müsste man mal nachschauen.

Jonius Team-Icon

Ikhayateam
(Themenstarter)
Avatar von Jonius

Anmeldungsdatum:
21. August 2009

Beiträge: 1861

Wohnort: München

Vain schrieb:

Schuss ins Blaue:

https://wiki.ubuntu.com/NattyNarwhal/ToolchainTransition

Sprich, mal versuchen, den Call zu „pkg-config“ ans Ende zu setzen.

gcc  -L/usr/X11R6/lib -g  -o metapixel main.o bitmap.o color.o ... `pkg-config --libs glib-2.0`

Das ganze wird über ein Makefile kompiliert. Soweit ich das überblicke steht das bereits am Ende. Hier mal das Makefile:

PREFIX = /usr/local
INSTALL = install
MANPAGE_XSL = /usr/share/xml/docbook/stylesheet/nwalsh/current/manpages/docbook.xsl

BINDIR = $(PREFIX)/bin
MANDIR = $(PREFIX)/man

VERSION = 1.1.0

DEBUG = -g
#OPTIMIZE = -O2
#PROFILE = -pg

#MACOS_LDOPTS = -L/sw/lib
#MACOS_CFLAGS = -I/usr/X11/include/libpng15

CC = gcc
CFLAGS = $(MACOS_CFLAGS) $(OPTIMIZE) $(DEBUG) $(PROFILE)
FORMATDEFS = -DRWIMG_JPEG -DRWIMG_PNG -DRWIMG_GIF

export CFLAGS CC FORMATDEFS

LDOPTS = $(MACOS_LDOPTS) -L/usr/X11R6/lib $(PROFILE) $(DEBUG) `pkg-config --libs glib-2.0`
CCOPTS = $(CFLAGS) -I/usr/X11R6/include -I/usr/X11R6/include/X11 -I. -Wall \
	 -DMETAPIXEL_VERSION=\"$(VERSION)\" $(FORMATDEFS) -DCONSOLE_OUTPUT `pkg-config --cflags glib-2.0`
CC = gcc
#LIBFFM = -lffm

OBJS = main.o bitmap.o color.o metric.o matcher.o tiling.o metapixel.o library.o classic.o collage.o search.o \
	utils.o error.o zoom.o \
	getopt.o getopt1.o
IMAGESIZE_OBJS = imagesize.o
BOREDOM_OBJS = boredom.o

all : metapixel metapixel.1 imagesize boredom

librwimg :
	$(MAKE) -C rwimg

liblispreader :
	$(MAKE) -C lispreader

metapixel : $(OBJS) librwimg liblispreader
	$(CC) $(LDOPTS) -o metapixel $(OBJS) rwimg/librwimg.a lispreader/liblispreader.a -lpng -ljpeg -lgif $(LIBFFM) -lm -lz

metapixel.1 : metapixel.xml
	xsltproc --nonet $(MANPAGE_XSL) metapixel.xml

imagesize : $(IMAGESIZE_OBJS)
	$(CC) $(LDOPTS) -o imagesize $(IMAGESIZE_OBJS) rwimg/librwimg.a -lpng -ljpeg -lgif -lm -lz

boredom : $(BOREDOM_OBJS)
	$(CC) $(LDOPTS) -o boredom $(BOREDOM_OBJS) rwimg/librwimg.a -lpng -ljpeg -lgif -lm -lz

zoom : zoom.c rwjpeg.c rwpng.c readimage.c writeimage.c
	$(CC) -o zoom $(OPTIMIZE) $(PROFILE) $(MACOS_CCOPTS) -DTEST_ZOOM -DRWIMG_JPEG -DRWIMG_PNG \
		zoom.c rwjpeg.c rwpng.c readimage.c writeimage.c $(MACOS_LDOPTS) -lpng -ljpeg -lm -lz

%.o : %.c
	$(CC) $(CCOPTS) -c $<

TAGS :
	etags `find . -name '*.c' -o -name '*.h'`

install : metapixel metapixel.1
	$(INSTALL) -d $(BINDIR)
	$(INSTALL) metapixel $(BINDIR)
	$(INSTALL) metapixel-prepare $(BINDIR)
	$(INSTALL) metapixel.1 $(MANDIR)/man1
#	$(INSTALL) imagesize $(BINDIR)
#	$(INSTALL) sizesort $(BINDIR)

clean :
	rm -f *.o metapixel imagesize boredom *~
	$(MAKE) -C rwimg clean
	$(MAKE) -C lispreader clean

realclean : clean
	rm -f metapixel.1

dist : metapixel.1
	rm -rf metapixel-$(VERSION)
	mkdir metapixel-$(VERSION)
	cp Makefile README NEWS COPYING *.[ch] metapixel-prepare sizesort metapixel.xml metapixel.1 metapixelrc \
		metapixel-$(VERSION)/
	tar -zcvf metapixel-$(VERSION).tar.gz metapixel-$(VERSION)
	rm -rf metapixel-$(VERSION)

Vielleicht ist deine GLib-Version auch zu alt oder zu neu, um die Versionen da zu beinhalten. Müsste man mal nachschauen.

Wo schaut man das nach?

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2505

Jonius schrieb:

Soweit ich das überblicke steht das bereits am Ende.

Es steht am Ende von „$LDOPTS“ und „$CCOPTS“, aber nicht am Ende des gcc-Aufrufs.

# Okay:
LDOPTS = $(MACOS_LDOPTS) -L/usr/X11R6/lib $(PROFILE) $(DEBUG) `pkg-config --libs glib-2.0`
CCOPTS = $(CFLAGS) -I/usr/X11R6/include -I/usr/X11R6/include/X11 -I. -Wall \
	 -DMETAPIXEL_VERSION=\"$(VERSION)\" $(FORMATDEFS) -DCONSOLE_OUTPUT `pkg-config --cflags glib-2.0`

# ...

# Geändert:
metapixel : $(OBJS) librwimg liblispreader
	$(CC) -o metapixel $(OBJS) rwimg/librwimg.a lispreader/liblispreader.a -lpng -ljpeg -lgif $(LIBFFM) -lm -lz $(LDOPTS)

# ...

# Geändert:
imagesize : $(IMAGESIZE_OBJS)
	$(CC) -o imagesize $(IMAGESIZE_OBJS) rwimg/librwimg.a -lpng -ljpeg -lgif -lm -lz $(LDOPTS)

# Geändert:
boredom : $(BOREDOM_OBJS)
	$(CC) -o boredom $(BOREDOM_OBJS) rwimg/librwimg.a -lpng -ljpeg -lgif -lm -lz $(LDOPTS)

# ...

# Geändert:
%.o : %.c
	$(CC) -c $< $(CCOPTS)

# ...

Vielleicht ist deine GLib-Version auch zu alt oder zu neu, um die Versionen da zu beinhalten. Müsste man mal nachschauen.

Wo schaut man das nach?

In der Doku zur GLib. Zum Beispiel g_strsplit. Aber da steht schon gar kein „since“ mehr (wie bei „g_strsplit_set“ darunter zum Beispiel), also nehme ich an, dass es die Funktion schon echt lange gibt. Glaube nicht, dass das das Problem ist.

Jonius Team-Icon

Ikhayateam
(Themenstarter)
Avatar von Jonius

Anmeldungsdatum:
21. August 2009

Beiträge: 1861

Wohnort: München

Vain schrieb:

Jonius schrieb:

Soweit ich das überblicke steht das bereits am Ende.

Es steht am Ende von „$LDOPTS“ und „$CCOPTS“, aber nicht am Ende des gcc-Aufrufs.

# Okay:
LDOPTS = $(MACOS_LDOPTS) -L/usr/X11R6/lib $(PROFILE) $(DEBUG) `pkg-config --libs glib-2.0`
CCOPTS = $(CFLAGS) -I/usr/X11R6/include -I/usr/X11R6/include/X11 -I. -Wall \
	 -DMETAPIXEL_VERSION=\"$(VERSION)\" $(FORMATDEFS) -DCONSOLE_OUTPUT `pkg-config --cflags glib-2.0`

# ...

# Geändert:
metapixel : $(OBJS) librwimg liblispreader
	$(CC) -o metapixel $(OBJS) rwimg/librwimg.a lispreader/liblispreader.a -lpng -ljpeg -lgif $(LIBFFM) -lm -lz $(LDOPTS)

# ...

# Geändert:
imagesize : $(IMAGESIZE_OBJS)
	$(CC) -o imagesize $(IMAGESIZE_OBJS) rwimg/librwimg.a -lpng -ljpeg -lgif -lm -lz $(LDOPTS)

# Geändert:
boredom : $(BOREDOM_OBJS)
	$(CC) -o boredom $(BOREDOM_OBJS) rwimg/librwimg.a -lpng -ljpeg -lgif -lm -lz $(LDOPTS)

# ...

# Geändert:
%.o : %.c
	$(CC) -c $< $(CCOPTS)

# ...

Es scheint fast so, als hätte es das Problem behoben. Dafür bekomme ich eine andere Fehlermeldung:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
make
make -C rwimg
make[1]: Betrete Verzeichnis '/home/jonatan/.Programmierumgebung/C/metapixel/rwimg'
make[1]: Für das Ziel »all« ist nichts zu tun.
make[1]: Verlasse Verzeichnis '/home/jonatan/.Programmierumgebung/C/metapixel/rwimg'
make -C lispreader
make[1]: Betrete Verzeichnis '/home/jonatan/.Programmierumgebung/C/metapixel/lispreader'
make[1]: Für das Ziel »all« ist nichts zu tun.
make[1]: Verlasse Verzeichnis '/home/jonatan/.Programmierumgebung/C/metapixel/lispreader'
gcc -o metapixel main.o bitmap.o color.o metric.o matcher.o tiling.o metapixel.o library.o classic.o collage.o search.o utils.o error.o zoom.o getopt.o getopt1.o rwimg/librwimg.a lispreader/liblispreader.a -lpng -ljpeg -lgif  -lm -lz  -L/usr/X11R6/lib  -g `pkg-config --libs glib-2.0`
xsltproc --nonet /usr/share/xml/docbook/stylesheet/nwalsh/current/manpages/docbook.xsl metapixel.xml
make: xsltproc: Kommando nicht gefunden
make: *** [metapixel.1] Fehler 127

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2505

Dann brauchst du wohl das passende Paket:

http://packages.ubuntu.com/precise/xsltproc

Es stellt sich übrigens auch mir die Frage, was bei Ubuntu/Debian der goldene Weg ist, um ein existierendes Paket anzupassen. Ich musste mich damit noch nie beschäftigen, weil ich das in Arch komfortabel über das ABS machen kann (PKGBUILD aus dem Tree kopieren, eigenen Patch schreiben, ins PKGBUILD einfügen, „makepkg -sirc“, fertig – um Abhängigkeiten kümmert er sich, Patches der Distribution sind schon dabei usw.).

Ich dachte zuerst, dass dein Problem ganz leicht lösbar ist. Wenn du jetzt aber nach und nach vom einen ins andere Problem läufst (wer weiß, was als nächstes kommt), dann bin ich mal lieber still, bevor ich dich in falsche Richtungen lenke. Das Anpassen von Paketen bei Ubuntu muss doch auch irgendwie „sauber“ funktionieren, ohne diese Frickelei. Das weiß bestimmt einer der „richtigen“ Ubuntu-User hier. ☺

Jonius Team-Icon

Ikhayateam
(Themenstarter)
Avatar von Jonius

Anmeldungsdatum:
21. August 2009

Beiträge: 1861

Wohnort: München

Vain schrieb:

Dann brauchst du wohl das passende Paket:

http://packages.ubuntu.com/precise/xsltproc

Okay, auf die Idee hätte ich auch kommen können. Aber danke.

Es stellt sich übrigens auch mir die Frage, was bei Ubuntu/Debian der goldene Weg ist, um ein existierendes Paket anzupassen. Ich musste mich damit noch nie beschäftigen, weil ich das in Arch komfortabel über das ABS machen kann (PKGBUILD aus dem Tree kopieren, eigenen Patch schreiben, ins PKGBUILD einfügen, „makepkg -sirc“, fertig – um Abhängigkeiten kümmert er sich, Patches der Distribution sind schon dabei usw.).

Ich dachte zuerst, dass dein Problem ganz leicht lösbar ist. Wenn du jetzt aber nach und nach vom einen ins andere Problem läufst (wer weiß, was als nächstes kommt)...

Tatsächlich der nächste Fehler:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
make
make -C rwimg
make[1]: Betrete Verzeichnis '/home/jonatan/.Programmierumgebung/C/metapixel/rwimg'
make[1]: Für das Ziel »all« ist nichts zu tun.
make[1]: Verlasse Verzeichnis '/home/jonatan/.Programmierumgebung/C/metapixel/rwimg'
make -C lispreader
make[1]: Betrete Verzeichnis '/home/jonatan/.Programmierumgebung/C/metapixel/lispreader'
make[1]: Für das Ziel »all« ist nichts zu tun.
make[1]: Verlasse Verzeichnis '/home/jonatan/.Programmierumgebung/C/metapixel/lispreader'
gcc -o metapixel main.o bitmap.o color.o metric.o matcher.o tiling.o metapixel.o library.o classic.o collage.o search.o utils.o error.o zoom.o getopt.o getopt1.o rwimg/librwimg.a lispreader/liblispreader.a -lpng -ljpeg -lgif  -lm -lz  -L/usr/X11R6/lib  -g `pkg-config --libs glib-2.0`
xsltproc --nonet /usr/share/xml/docbook/stylesheet/nwalsh/current/manpages/docbook.xsl metapixel.xml
warning: failed to load external entity "/usr/share/xml/docbook/stylesheet/nwalsh/current/manpages/docbook.xsl"
cannot parse /usr/share/xml/docbook/stylesheet/nwalsh/current/manpages/docbook.xsl
make: *** [metapixel.1] Fehler 4

Jonius Team-Icon

Ikhayateam
(Themenstarter)
Avatar von Jonius

Anmeldungsdatum:
21. August 2009

Beiträge: 1861

Wohnort: München

Kann es sein, dass wenn einmal einer geantwortet hat, sonst keiner mehr auf das Forum stößt und man dadurch keine Hilfe mehr von anderen bekommt?

Kuehly

Anmeldungsdatum:
15. Oktober 2006

Beiträge: 282

Hm, er findet die Datei /usr/share/xml/docbook/stylesheet/nwalsh/current/manpages/docbook.xsl nicht. Ich kann nicht sicher sagen, in welchem Paket die enthalten ist. Es könnte docbook-xsl sein.

Aber da metapixel selbst ja auch in den Quellen vorhanden ist: kann man nicht irgendwie die Pakete, die zum kompilieren nötig sind, sich installieren lassen?

– Jan

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Die Geschichte sieht mir gerade so aus, als wenn hier der Pfad bei Ubuntu anders steht als bei der Version die Du Dir aus dem git geholt hast.

Schau Dir mal auf der Paket-Seite rechts im Kästchen "Ressourcen" die diff- Datei an. Dort werden u.a. diverse Pfade für Debian angepasst.
Vielleicht reicht es ja schon, wenn Du die passende diff-Datei auf Deine Quelle anwendest. (aber beachte bitte die Versionsnummer !)
Sonst findest Du dort mit Sicherheit Hinweise, welche Pfade Du anpassen musst.

Alternativ könntest Du natürlich auch mit apt-get das Quellpaket aus dem Repo holen und das Deine Anpassungen darauf aufbauen.

LG,

track

Jonius Team-Icon

Ikhayateam
(Themenstarter)
Avatar von Jonius

Anmeldungsdatum:
21. August 2009

Beiträge: 1861

Wohnort: München

track schrieb:

Schau Dir mal auf der Paket-Seite rechts im Kästchen "Ressourcen" die diff- Datei an. Dort werden u.a. diverse Pfade für Debian angepasst.

In der Datei metapixel_1.0.2-7.1.diff finde ich keine Pfadanpassung. Was meinst du?

Alternativ könntest Du natürlich auch mit apt-get das Quellpaket aus dem Repo holen und das Deine Anpassungen darauf aufbauen.

wie geht das?

radoe2

Anmeldungsdatum:
30. November 2006

Beiträge: 243

Jonius schrieb:

track schrieb:

Schau Dir mal auf der Paket-Seite rechts im Kästchen "Ressourcen" die diff- Datei an. Dort werden u.a. diverse Pfade für Debian angepasst.

In der Datei metapixel_1.0.2-7.1.diff finde ich keine Pfadanpassung. Was meinst du?

Alternativ könntest Du natürlich auch mit apt-get das Quellpaket aus dem Repo holen und das Deine Anpassungen darauf aufbauen.

wie geht das?

Doch, die Pfadanpassung gibt es. Da die XSL Datei zur Erzeugung von Manpages aus DocBook-Quellen unter Ubuntu woanders liegt, wird das Makefile mit entsprechenden Optionen zur Anpassung der entsprechenden Variablen im Makefile aufgerufen:

$(MAKE) MANPAGE_XSL=/usr/share/sgml/docbook/stylesheet/xsl/nwalsh/manpages/docbook.xsl

Jonius Team-Icon

Ikhayateam
(Themenstarter)
Avatar von Jonius

Anmeldungsdatum:
21. August 2009

Beiträge: 1861

Wohnort: München

Das Makefile, das in der diff-Datei steht erzeugt mit den über git heruntergeladenen Quelltexten auch Fehler. Ich weiß aber nicht, wie ich da jetzt basteln müsste. Wie komme ich denn an den Quelltext des Ubuntupakets?

Antworten |