Hallo Volker, Volker Weißmann <volker.weissmann@gmx.de> (Fr 27 Dez 2013 20:10:55 CET): > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > Am 25.12.2013 11:30, schrieb Heiko Schlittermann: > > Volker Weißmann <volker.weissmann@gmx.de> (Di 24 Dez 2013 16:25:38 > > CET): > >> Wenn ich das #include<X11.Xlib.h> weglasse und stattdessen via > >> Str + C > > ~~~~~~~~ bitte versuche mal korrekt zu „pasten“ > >> und Str + V den Inhalt der Datei Xlib.h in meine test.c > >> reinkopiere gibt es immer noch den Selben Fehler. > > > > Weil Dein Problem der Linker ist, der eine Library nicht finden > > kann. Vermutlich eine libX11.so. Ich denke, der Linker möchte einen > > Schalter -lX11 sehen. > > > > Da Du den Linker wohl über den „gcc“ aufrufst, wird halt „gcc … > > -lX11“ die Lösung sein. Wo Du das in Deiner IDE einträgst, weiss > > ich nicht. > > > Ich hab es hingekriegt, aber: > Verstehe ich es richtig, dass der gcc zwar "extern Display *XOpenDisplay( > _Xconst char* /* display_name */ > );" finden kann, aber (wegen dem extern) nicht den Methoden Rumpf sieht? > Und in der datei /usr/lib/X11/... der Methoden Rumpf steht, er aber > nur durch -lX11 danach sucht? Ja. Der compilierte Methodenrumpf. Der Compiler(!) wird durch „extern Display* XOpenDisplay(…)“ davon überzeugt, dass es eine Funktion gibt, die XOpenDisplay heisst. Damit er, wenn er möchte, auch noch den Aufruf prüfen kann, sind auch noch die Typen der Übergabeparameter deklariert(!). Aus technischer Sicht genügt dem Compiler(!) der Name der Funktion. Er sorgt dann an der Stelle des Aufrufs dafür, dass die dort übergebenen Parameter auf den Stack kommen und anschließend ein „call XOpendisplay“ gemacht wird. Der Compiler(!) ist also mit der Deklaration(!) der Funktion zufrieden. Später der Linker möchte aus dem „call XOpenDisplay“ ein „call 0x4711“ machen, also einen Call auf die Adresse, an der die Funktion tatsächlich steht. Dafür muß er die Bibliothek haben, damit er rausfinden kann, dass die Funktion XOpenDisplay an der Adresse 0x4711 liegt. (In Wirklichkeit ist Dein Programm dynamisch gelinkt, nehme ich an (kannst Du mit „ldd dein-programm“ rausfinden, dass heisst, beim Start des Programms wird erst der Linker-Schritt vollzogen. Das, was ich oben beschrieben habe, ist die statische Variante. Die dynamische ist aber „prinzipiell“ genauso. Der Linker bei der Programmerstellung möchte zwar nicht die wirkliche Adresse sehen, aber er möchte sehen, daß es Deine Funktion in der später verwendeten Bibliothek auch gibt. (Vielleicht macht er auch noch andere Dinge, aber das weiss ich nicht so genau.) Mit -lX11 sagst Du dem gcc, dass er bitte dem Linker mitteilen soll, daß die libX11.* zu Deinem Programm dazu gehört. So heißt das, dass ein File /usr/lib/libX11.a (statisch) oder /usr/lib/libX11.so (dynamisch) vorhanden sein muss. pkg-config --libs x11 kann Dir da auch weiterhelfen. Best regards from Dresden/Germany Viele Grüße aus Dresden Heiko Schlittermann -- SCHLITTERMANN.de ---------------------------- internet & unix support - Heiko Schlittermann, Dipl.-Ing. (TU) - {fon,fax}: +49.351.802998{1,3} - gnupg encrypted messages are welcome --------------- key ID: 7CBF764A - gnupg fingerprint: 9288 F17D BBF9 9625 5ABC 285C 26A9 687E 7CBF 764A - (gnupg fingerprint: 3061 CFBF 2D88 F034 E8D2 7E92 EE4E AC98 48D0 359B)-
Attachment:
signature.asc
Description: Digital signature