Probleme mit einem Linker bei einem TIF-Projekt
-
Hallo Leute!
Ich möchte euch kurz ein Problem von mir vortragen, bei dem ich als relativer c-/Linux-Neuling nicht so recht weiterkomme. Vll. steckt eine ganz einfache Lösung dahinter und ihr könnt mir helfen. Also:Ich möchte ein großes tif-Bild im Aperio-Format (http://bigtiff.org/)
mit einem C-Programm öffnen der Code in der main.c soll etwa so aussehen://testweises Laden eines TIF-Bildes! // TIFF* tif = TIFFOpen("Test.tif", "r"); if (tif) { uint32 w, h; size_t npixels; uint32* raster; TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &w); TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &h); npixels = w * h; raster = (uint32*) _TIFFmalloc(npixels * sizeof (uint32)); if (raster != NULL) { if (TIFFReadRGBAImage(tif, w, h, raster, 0)) { //...process raster data... } _TIFFfree(raster); } TIFFClose(tif); }
Dafür habe ich die unter der obig angegebenen Adresse bereitgestellte lib herunterlgeladen und ge"make"d.
Mein Makefile sieht ungefähr so aus:
[...]
#CFLAGS = -I/usr/include $(DEBUGFLAG) $(INCLUDEDIR) CFLAGS = -I/usr/include -Ijpeg $(DEBUGFLAG) #CFLAGS = $(INCLUDEDIR) -O -fomit-frame-pointer -ffast-math -finline-functions $(DEBUGFLAG) $(PROFLAG) $(PROTOFLAG) -DLONG_32 -DSYSV -DLINUX # for SunOS cc, just use the above # for cc on HPUX: #HP-CC-FLAGS = -Aa $(CFLAGS) -D_HPUX_SOURCE -DBSD -DNONANSI_INCLUDES LD = $(CC) OBJS = image.o jpeg.o main.o manipulate.o LIBS = jpeg/libjpeg.a bigtiff/libtiff.a bigtiff/libz.a bigtiff/libjpeg.a #LIBS = bigtiff/libjpeg.a bigtiff/libtiff.a PROGRAM = ../image_analysis SRCS = image.c jpeg.c main.c manipulate.c all: $(PROGRAM) # strip $(PROGRAM) $(PROGRAM): $(OBJS) $(LD) -g $(OBJS) $(LIBS) -lm -o $(PROGRAM) clean:; @rm -f *.o core $(PROGRAM)
[...]
leider kommt beim maken ein doofer Fehler und zwar wenn ich vom obigen Code folgende Zeile einsetze:
if (TIFFReadRGBAImage(tif, w, h, raster, 0))
OHNE diese Zeile, läuft alles tadellos. Als fehler beim Maken bekomme ich folgendes angezeigt:
gcc -g image.o jpeg.o main.o manipulate.o jpeg/libjpeg.a bigtiff/libtiff.a bigtiff/libz.a -lm -o ../image_analysis bigtiff/libtiff.a(tif_getimage.o ) : In function `putcontig8bitYCbCr11tile': tif_getimage.c: (.text+0x3611 ) : undefined reference to `TIFFYCbCrtoRGB' bigtiff/libtiff.a(tif_getimage.o ) : In function `putcontig8bitYCbCr21tile': tif_getimage.c: (.text+0x36e7 ) : undefined reference to `TIFFYCbCrtoRGB' tif_getimage.c: (.text+0x373c): undefined reference to `TIFFYCbCrtoRGB' tif_getimage.c: (.text+0x37ce): undefined reference to `TIFFYCbCrtoRGB' bigtiff/libtiff.a(tif_getimage.o): In function `putcontig8bitYCbCr22tile': tif_getimage.c: (.text+0x38d4): undefined reference to `TIFFYCbCrtoRGB' bigtiff/libtiff.a(tif_getimage.o):tif_getimage.c:(.text+0x3928): more undefined references to `TIFFYCbCrtoRGB' follow bigtiff/libtiff.a(tif_getimage.o): In function `putcontig8bitCIELab': tif_getimage.c: (.text+0x53ae): undefined reference to `TIFFCIELabToXYZ' tif_getimage.c: (.text+0x53e3): undefined reference to `TIFFXYZToRGB' bigtiff/libtiff.a(tif_getimage.o): In function `TIFFRGBAImageBegin': tif_getimage.c: (.text+0x5b8c): undefined reference to `TIFFCIELabToRGBInit' tif_getimage.c : (.text+0x5c12): undefined reference to `TIFFYCbCrToRGBInit' collect2: ld returned 1 exit status make: *** [../image_analysis] Fehler 1
Wenn mir da jemand helfen kann, ist er mein Held
Vieeeelen Dank auch schon, wenn du bis hier her gelesen hast. Bei Unklarheiten/Fragen,
einfach posten, ich konkretiesiere gerneLg
-Arv
-
Arv schrieb:
Mein Makefile sieht ungefähr so aus:
-Arv"Mein Makefile" bezieht sich auf dem Makefile MEINES Projektes. Der Makefile von bigtiff ist ja schon vorgegeben.
Lg
-Arv
-
Nun, TIFFYCbCrtoRGB ist nicht da, aber das hast du sicherlich schon gewusst
. Ich werde jetzt nicht die Doku zu deiner Bibliothek durchlesen (das ist deine Aufgabe), aber erfahrungsgemäß gibt es dafür zwei typische Ursachen:
1. Eine nötige Abhängigkeit fehlt noch (libtiff vielleicht oder ein zweiter Teil von dieser bigtiff Bibliothek?).
2. Die Abhängigkeiten sind alle da, aber in falscher Reihenfolge. Beim GCC stehen links die Bibliotheken und Objektdateien, die von denen weiter rechts abhängig sind.
-
SeppJ schrieb:
Nun, TIFFYCbCrtoRGB ist nicht da, aber das hast du sicherlich schon gewusst
. Ich werde jetzt nicht die Doku zu deiner Bibliothek durchlesen (das ist deine Aufgabe)
Wo es eine solche Doku gibt, weiß ich leider nicht. Außerdem habe ich wohl nicht die skills da komplett durchzusteigen.
1. Eine nötige Abhängigkeit fehlt noch (libtiff vielleicht oder ein zweiter Teil von dieser bigtiff Bibliothek?).
Eine nötige Abhängigkeit heißt hier evt noch die einbindung einer weiteren lib? Das sind auf jedenfall alle mitgelieferten libs gewesen...
2. Die Abhängigkeiten sind alle da, aber in falscher Reihenfolge. Beim GCC stehen links die Bibliotheken und Objektdateien, die von denen weiter rechts abhängig sind.
Meinst du damit insbesondere diese Zeile?
LIBS = bigtiff/libtiff.a bigtiff/libz.a bigtiff/libjpeg.a jpeg/libjpeg.a
Eine Änderung der Reihenfolge bringt nichts. Lediglich wenn die libz vor die tiff geschoben wird, dann gibt es ärger, weil er was nicht findet.
-
Arv schrieb:
SeppJ schrieb:
Nun, TIFFYCbCrtoRGB ist nicht da, aber das hast du sicherlich schon gewusst
. Ich werde jetzt nicht die Doku zu deiner Bibliothek durchlesen (das ist deine Aufgabe)
Wo es eine solche Doku gibt, weiß ich leider nicht. Außerdem habe ich wohl nicht die skills da komplett durchzusteigen.
Dann musst du es lernen. Sowohl das Suchen und Finden einer Dokumentation, als auch das Lesen.
1. Eine nötige Abhängigkeit fehlt noch (libtiff vielleicht oder ein zweiter Teil von dieser bigtiff Bibliothek?).
Eine nötige Abhängigkeit heißt hier evt noch die einbindung einer weiteren lib?
Ja.
Das sind auf jedenfall alle mitgelieferten libs gewesen...
Das heißt ja nicht, dass nicht noch etwas anderes benötigt wird. Siehe Dokumentation.
2. Die Abhängigkeiten sind alle da, aber in falscher Reihenfolge. Beim GCC stehen links die Bibliotheken und Objektdateien, die von denen weiter rechts abhängig sind.
Meinst du damit insbesondere diese Zeile?
LIBS = bigtiff/libtiff.a bigtiff/libz.a bigtiff/libjpeg.a jpeg/libjpeg.a
Ja.
Eine Änderung der Reihenfolge bringt nichts. Lediglich wenn die libz vor die tiff geschoben wird, dann gibt es ärger, weil er was nicht findet.
Dann wird das Problem wohl Punkt 1 sein.
-
SeppJ schrieb:
Dann musst du es lernen. Sowohl das Suchen und Finden einer Dokumentation, als auch das Lesen.
sehr charmant...
-
die ganzen TIFFY-xyz funktionen, die nicht gefunden werden, deuten auf ein abhängigkeitsproblem hin, aber das hat ja der sepp ja schon genannt.
fehlt also ne lib oder ne header-datei oder ein #include ?