[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Problem bei C Fensterprogrammierung



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


Reply to: