Hallo,
habe ein kleines Programm, welches sich leider nicht uebersetzen laesst. Hier der Aufruf von make:
make gif2mask gcc -g -Wall gif2mask.c -o gif2mask -lungif -lm -lz /usr/lib/libungif.so: undefined reference to `XDestroyImage' /usr/lib/libungif.so: undefined reference to `XGetWindowAttributes' /usr/lib/libungif.so: undefined reference to `XGetImage' /usr/lib/libungif.so: undefined reference to `XGetPixel' /usr/lib/libungif.so: undefined reference to `XQueryColors' collect2: ld returned 1 exit status make: *** [gif2mask] Error 1
Da der Quelltext recht kurz ist, erlaube ich mir mal den mit zu posten:
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <math.h> #include <gif_lib.h> #include <zlib.h>
#define max(a,b,c) (((a)>(b))?(((c)>(a))?(c):(a)):(((c)>(b))?(c):(b)))
void error(char *msg) { printf("%s:\n\n", msg); PrintGifError(); exit(-1); }
unsigned char *readGif(char *fileName, int *length) { GifFileType *file; char *bits; unsigned char colorMap[256]; unsigned char *data; int i, nColors, size;
if((file = DGifOpenFileName(fileName)) == NULL) error("Error opening file");
if(DGifSlurp(file) != GIF_OK) error("Error slurping file");
/* data should now be available */
nColors = file->SColorMap->ColorCount;
for(i=0; i<nColors; ++i) { GifColorType c = file->SColorMap->Colors[i];
colorMap[i] = max(c.Blue, c.Red, c.Green); }
bits = file->SavedImages[0].RasterBits;
size = file->SWidth * file->SHeight; data = malloc(size);
for(i=0; i<size; ++i) data[i] = colorMap[(unsigned char)bits[i]];
*length = size;
return data; }
void usage() { printf("gif2mask - convert a gif image to an alpha mask\n"); printf("\nusage: gif2mask <file.gif>\n");
exit(0); }
int main(int argc, char *argv[]) { int len, size; long outsize; char *outfile; unsigned char *data, *outdata; FILE *mask;
if(argc < 1) usage();
len = strlen(argv[1]);
if(strcmp(argv[1]+len-4, ".gif") != 0) usage();
outfile = strdup(argv[1]);
outfile[len-3] = 'm'; outfile[len-2] = 's'; outfile[len-1] = 'k';
data = readGif(argv[1], &size);
outdata = malloc(outsize = (int)floor(size*1.01+12));
/* zlib-compress the gif data */
compress2(outdata, &outsize, data, size, 9);
/* dump to outfile */
mask = fopen(outfile, "wb");
if(fwrite(outdata, sizeof(char), outsize, mask) != outsize) { printf("Didn't write all of the file!"); exit(-1); }
exit(0); }
die Rechner: suse7.2 paket libungif(4.1.0) ist installiert paket xdevel(4.0.3) auch (bei dem einen ja, beim andern nicht, gleiches Ergebnis)
Es scheint so, als ob irgendwas nicht gefunden wird. Wie kann ich das am besten herausfinden?? Und wie fixe ich sowas?
Habs ja mal spasseshalber mit knoppix3.0 probiert, hat mich aber auch nicht weitergebracht.
gegoogelt, habe aber nur so etwas in der Art gefunden, dass da wahrscheinlich irgendwelche sachen von "Xlib eingebunden werden" und dass das eigentlich fuer die Bibliothek nicht notwendig und komisch sei.
Peter
On Sat, 28 Sep 2002 20:42:09 +0200, Peter Liscovius wrote:
make gif2mask gcc -g -Wall gif2mask.c -o gif2mask -lungif -lm -lz /usr/lib/libungif.so: undefined reference to `XDestroyImage' /usr/lib/libungif.so: undefined reference to `XGetWindowAttributes' /usr/lib/libungif.so: undefined reference to `XGetImage' /usr/lib/libungif.so: undefined reference to `XGetPixel' /usr/lib/libungif.so: undefined reference to `XQueryColors' collect2: ld returned 1 exit status make: *** [gif2mask] Error 1
Das Zeugs ist in der libX11. Häng mal -lX11 dran oder stelle deinen Suchpfad für Bibliothekenso so ein, daß er die lib automagisch findet. (man ld )
Mit "ldd /usr/lib/libungif.so" siehst du, was die lib noch haben möchte.
gegoogelt, habe aber nur so etwas in der Art gefunden, dass da wahrscheinlich irgendwelche sachen von "Xlib eingebunden werden" und dass das eigentlich fuer die Bibliothek nicht notwendig und komisch sei.
Das stimmte schon.
Reinhard
Hallo,
erstmal Danke Reinhard. Habs irgendwie doch noch hinbekommen. Aber verstanden habe ichs noch nicht:
Das Zeugs ist in der libX11. Häng mal -lX11 dran oder stelle deinen
ja, das hatte ich auch schon probiert, aendert aber leider nix.
gcc -g -Wall gif2mask.c -o gif2mask -lX11 -lungif -lm -lz /usr/i486-suse-linux/bin/ld: cannot find -lX11 collect2: ld returned 1 exit status make: *** [gif2mask] Error 1
Suchpfad für Bibliothekenso so ein, daß er die lib automagisch findet.
gcc -g -Wall gif2mask.c -o gif2mask -L/usr/X11R6/lib -lungif -lm -lz /usr/lib/libungif.so: undefined reference to `XDestroyImage' ..usw.
Die Kombination beider hilft auch nicht.
Mit "ldd /usr/lib/libungif.so" siehst du, was die lib noch haben möchte.
ldd /usr/lib/libungif.so libc.so.6 => /lib/libc.so.6 (0x4000d000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x2aaaa000)
falls es helfen sollte: rpm -qif /usr/X11R6/lib/libX11.so.6
Name : xshared Relocations: (not relocateable) Version : 4.0.3 Vendor: SuSE GmbH, Nuernberg, Germany
Als letzten verzweifelten Versuch habe ich folgendes probiert: su cd /lib ln -s /usr/X11/lib/libX11.so libX11.so
Und siehe da, es funktioniert. Kann ja aber nicht die normale Leosung sein, oder? Kann man mir bitte jemand dafuer ne erleuchtende Erklaerung geben?? (wollte die mail grade abschicken und nur noch meinen letzten jaemmerlichen Versuch hinzufuegen als "es passierte" :-)
Peter
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
On Saturday 28 September 2002 23:57, Peter Liscovius wrote:
Als letzten verzweifelten Versuch habe ich folgendes probiert: su cd /lib ln -s /usr/X11/lib/libX11.so libX11.so
Und siehe da, es funktioniert. Kann ja aber nicht die normale Leosung sein, oder? Kann man mir bitte jemand dafuer ne erleuchtende Erklaerung geben?? (wollte die mail grade abschicken und nur noch meinen letzten jaemmerlichen Versuch hinzufuegen als "es passierte" :-)
Ist es auch nicht. "-L/lib -L/usr/lib -I/usr/include -lc" wird automagisch vom gcc angenommen (es sind eigentlich noch ein paar mehr fuer die gcc-lib).
gcc -g -Wall gif2mask.c -o gif2mask -L/usr/X11R6/lib -lungif -lX11 -lm -lz
0. mit -I alle Verzeichnisse angeben, in denen sich noetige Header befinden 1. mit -L alle Verzeichnisse angeben, in denen sich noetige Libs befinden 2. mit -l alle Libs angeben, die Du brauchst 3. die .o, .a -Dateien und -llibs in der Reihenfolge angeben, dass das was von einer anderen lib gebraucht wird immer _hinter_ dieser steht (die .o mit main drin muss also als erstes kommen)
Gruende: 0. Der Compiler nimmt an, dass alles Wichtige in /usr/include liegt, sollte dem nicht so sein muss man es ihm sagen. 1. Es wird nur in den System-Lib-Dirs gesucht. X11 gehoert nicht zum eigentlichen System, sondern ist eine Grafik_erweiterung_. 2. Das normale (Console-) Programm ist mit der libc schon voellig zufrieden. Wenn es Deines nicht ist, muss man das dem Compiler mitteilen. Bei C gibt es keine Moeglichkeit im Quelltext zu sagen, was gebraucht wird (Header werden nicht vom Compiler sondern vom Praeprozessor aufgeloest). 3. Der Linker optimiert noch waehrend er die einzelnen Dateien einliest, alle ueberfluessigen Symbole (=Funktionen und Variablen) werden nicht in das fertige Programm uebernommen (bei shared libs untereinander kann man Glueck haben, da er die ja nicht veraendert).
Konrad
- -- BOFH excuse #2:
solar flares
lug-dd@mailman.schlittermann.de