1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

x11 window unter c++

Dieses Thema im Forum "OS X-Developer" wurde erstellt von mr.cyberfrog, 27.11.06.

  1. mr.cyberfrog

    mr.cyberfrog Jonagold

    Dabei seit:
    15.11.06
    Beiträge:
    20
    moin!

    brauche zwecks studium ein x11 window unter c++, sprich ich möchte bestimmte simulationen in c++ über ein x11 window grafisch darstellen. in der vorlesung wurde uns ein c++-programm bereitgestellt, ist aber für linux konzipiert. wenn ich es unter mac (os 10.3.9) laufen lasse (x11 ist installiert und läuft soweit fehlerfrei), gibt er mir folgende fehlermeldung (sonst keine weiteren):

    ld: Undefined symbols:
    _main
    _XCheckTypedEvent
    _XClearWindow
    _XCloseDisplay
    _XCreateGC
    _XCreateSimpleWindow
    _XDestroyWindow
    _XDrawLine
    _XDrawPoint
    _XFreeGC
    _XLookupString
    _XMapRaised
    _XNextEvent
    _XOpenDisplay
    _XSelectInput
    _XSetBackground
    _XSetForeground
    _XSetStandardProperties
    ___gxx_personality_v0

    was muss ich ändern, damit es funktioniert?? oder hat jemand einen anderen code??

    hier dass uns bereitgestellte programm:

    //*****************************************************************************
    // Simple graphics interface for X11 Windows, by Haye Hinrichsen
    //*****************************************************************************

    #ifdef HAYE_WINDOWS
    #else
    #define HAYE_WINDOWS

    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
    #include <X11/Xlib.h>
    #include <X11/Xutil.h>

    class XWindow
    {
    private:
    Display *display; // Display handler
    Window window; // Window handler
    GC gc,gc2; // device context
    XEvent event; // event flag
    KeySym key;
    char PressedKey, KeyIsPressed; // keypress flag
    XSizeHints hint;
    int screen, sizex, sizey, ypos;
    unsigned long foreground, background;

    public:
    XWindow (void); // Konstruktor
    // Farbtabelle RGB:
    void Red (void) { XSetForeground(display, gc, 0xFF0000L); }
    void Yellow (void) { XSetForeground(display, gc, 0xFFFF00L); }
    void Green (void) { XSetForeground(display, gc, 0x00FF00L); }
    void Blue (void) { XSetForeground(display, gc, 0x0000FFL); }
    void Violet (void) { XSetForeground(display, gc, 0xFF00FFL); }
    void Black (void) { XSetForeground(display, gc, 0x000000L); }
    void White (void) { XSetForeground(display, gc, 0xFFFFFFL); }

    void Open (int x=600, int y=400, char* title = "Simulation");
    void Close(void);
    void Clear (void) { XClearWindow(display, window); ypos=0; }
    void Plot (int x, int y);
    void Plot (int x, int y, int c);
    void DrawLine (int x1, int y1, int x2, int y2);
    void SetColor(double c);
    void PlotState (int state[], int size, int xshift=0);
    void PlotColorState (int state[], int size, int xshift=0);
    void DecreaseYcoord (void) { ypos--; }
    bool KeyPressed (void);
    char GetCharacter (void) { KeyIsPressed=0; return (PressedKey); }
    int GetX (void) { return sizex; }
    int GetY (void) { return sizey; }
    char WaitForKeypress (void) { while (! KeyPressed()); return GetCharacter(); }
    void Wait (void) { while (! KeyPressed()); GetCharacter(); }
    };

    /////////////////// DEFINITION OF VARIOUS FUNCTIONS //////////////////////////

    //-------------------------------Constructor---------------------------------

    XWindow::XWindow (void)
    { PressedKey=0, KeyIsPressed=0; ypos=0; }


    //-------------------------------Open Window---------------------------------

    void XWindow::Open (int x, int y, char* title)
    {
    sizex = x; sizey = y;
    display = XOpenDisplay("");
    if(! display)
    {
    printf("### Error: Failed to open display !###\n");
    exit(1);
    }
    screen = DefaultScreen(display);
    background = WhitePixel(display, screen);
    foreground = BlackPixel(display, screen);
    hint.x = 200;
    hint.y = 300;
    hint.width = x;
    hint.height = y;
    hint.flags = PPosition | PSize;
    window = XCreateSimpleWindow(display, DefaultRootWindow(display),
    hint.x, hint.y, hint.width, hint.height,
    5, foreground, background);
    XSetStandardProperties(display, window, title, title, None, 0, 0,
    &hint);
    gc=XCreateGC(display, window, 0, 0);
    gc2=XCreateGC(display, window, 0, 0);
    XSetBackground(display, gc, background);
    XSetForeground(display, gc, foreground);
    XSetBackground(display, gc2, foreground);
    XSetForeground(display, gc2, background);
    XSelectInput(display, window, ButtonPressMask | KeyPressMask | ExposureMask);
    XMapRaised(display, window);
    XNextEvent(display, &event);
    }

    //-------------------------------------Plot-----------------------------------

    void XWindow::plot (int x, int y)
    {XDrawPoint(display, window, gc, x, y);}

    void XWindow::plot (int x, int y, int c)
    {if (c) XDrawPoint(display, window, gc, x, y);
    else XDrawPoint(display, window, gc2, x, y);}

    //-------------------------------------Line-----------------------------------

    void XWindow::DrawLine (int x1, int y1, int x2, int y2)
    {XDrawLine(display, window, gc, x1, y1, x2, y2);}


    //-----------------------------------PlotState--------------------------------

    void XWindow::plotState (int state[], int size, int xshift)
    {
    if (ypos>=sizey) { Clear(); ypos=0; };
    int x; for (x=0;x<sizex;x++) if (state[x]>0) Plot(xshift+x,ypos); ypos++;
    }

    void XWindow::plotColorState (int state[], int size, int xshift)
    {
    if (ypos>=sizey) { Clear(); ypos=0; };
    int x; for (x=0;x<sizex;x++) if (state[x]>0)
    { SetColor((double)state[x]/2); Plot(xshift+x,ypos);} ypos++;
    }


    //-----------------------------------Close Window-----------------------------

    void XWindow::Close()
    {
    XFreeGC(display, gc);
    XDestroyWindow(display, window);
    XCloseDisplay(display);
    }

    //----------------------------------- Set Color -----------------------------

    void XWindow::SetColor(double c)
    {
    double c1=c-floor(c);
    double c2=c1+1.0/3-floor(c1+1.0/3);
    double c3=c2+1.0/3-floor(c2+1.0/3);
    int r = 255-(c1<0.5 ? (int)(512*c1) : 511-(int)(512*c1));
    int g = 255-(c2<0.5 ? (int)(512*c2) : 511-(int)(512*c2));
    int b = 255-(c3<0.5 ? (int)(512*c3) : 511-(int)(512*c3));
    XSetForeground(display, gc, r<<16 | g<<8 | b);
    }


    // void XWindow::SetColor(double c)
    // {
    // double c1=c-floor(c);
    // double c2=c1+1.0/3; c2-=floor(c2);
    // double c3=c2+1.0/3; c3-=floor(c3);
    // int r = 31-(c1<0.5 ? (int)(64*c1) : 63-(int)(64*c1));
    // int g = 31-(c2<0.5 ? (int)(64*c2) : 63-(int)(64*c2));
    // int b = 31-(c3<0.5 ? (int)(64*c3) : 63-(int)(64*c3));
    // XSetForeground(display, gc, r<<11 | g<<6 | b);
    // }

    //------------------------------ Software for keypresses----------------------

    bool XWindow::KeyPressed (void)
    {
    if (KeyIsPressed) return 1;
    if (! XCheckTypedEvent(display,KeyPress,&event)) return 0;
    int i; char text[10];
    i=XLookupString((XKeyEvent *) &event, text, 10, &key, 0);
    if (i!=1) return 0;
    PressedKey=text[0]; KeyIsPressed=1;
    return 1;
    }

    //////////////////////////////////////////////////////////////////////////////

    #endif
     
  2. Bölzebub

    Bölzebub Querina

    Dabei seit:
    27.05.05
    Beiträge:
    180
    Die "_X..."-Fehler kommen auf jeden Fall mal daher, dass du libX11 dazulinken musst. Das Symbol "_main" kann nicht gefunden werden, weil die Klasse keine main-Funktion hat.

    Wie versuchst du das Programm "laufen zu lassen"?
     
  3. below

    below Kalterer Böhmer

    Dabei seit:
    08.10.06
    Beiträge:
    2.865
    Du musst auch bei der Installation von Xcode das X11 SDK installieren. Hast Du das gemacht?

    Alex
     
  4. below

    below Kalterer Böhmer

    Dabei seit:
    08.10.06
    Beiträge:
    2.865
    Mit

    g++ -L/usr/X11R6/lib -lX11 x11.cpp

    geht es bei mir, er meckert natürlich, dass kein main da ist.

    Alex
     
  5. mr.cyberfrog

    mr.cyberfrog Jonagold

    Dabei seit:
    15.11.06
    Beiträge:
    20
    habe das x11 sdk nachträglich installiert (einfach doppelklick auf dem packet und den installationshinweisen gefolgt). nach dem ich die zeile

    g++ -L/usr/X11R6/lib -lX11 x11.cpp

    eingetippt habe, bekam ich folgende fehlermeldung:

    g++: x11.cpp: No such file or directory

    im verzeichnis /usr/X11R6/lib/X11 nachgeschaut, existiert die datei x11.cpp nicht...


    mit der _main fehlermeldung kommt hin, das XWindow programm wird als header datei eingebunden, sprich ich muss in jedem fall noch eine main-fkt. schreiben in der ich dann auf XWindow zugreife...
     
  6. below

    below Kalterer Böhmer

    Dabei seit:
    08.10.06
    Beiträge:
    2.865
    Du hast den sourcecode hier reingepostet, irgendwie musste ich den ja nennen.

    Oder dachtest Du, ich hätte einen g++, der Gedanken lesen kann ;) ?

    Alex
     
  7. mr.cyberfrog

    mr.cyberfrog Jonagold

    Dabei seit:
    15.11.06
    Beiträge:
    20
    mit andern worten ich muss anstatt x11.cpp die datei dahinschreiben?? (sorry wenn ich so nachfragen muss, hab noch nich so den plan ;)

    muss diese datei noch in das verzeichnis /usr/X11R6/lib/X11 kopiert werden??
     
  8. below

    below Kalterer Böhmer

    Dabei seit:
    08.10.06
    Beiträge:
    2.865

    Ja

    Nein
     
  9. mr.cyberfrog

    mr.cyberfrog Jonagold

    Dabei seit:
    15.11.06
    Beiträge:
    20
    ok, es funktioniert. was müsste ich tun, damit ich die x11-codes bzw die programme mit x11 window über xcode gestartet kriege (übers terminal find ich die ganze sache einwenig umständlich)???
     
  10. below

    below Kalterer Böhmer

    Dabei seit:
    08.10.06
    Beiträge:
    2.865
    Wie startest Du die denn über das Terminal? Warum funktioniert es mit Xcode nicht?

    Damit ich auch was lerne, schick mir doch mal Dein komplettes Projekt :D

    Alex
     
  11. mr.cyberfrog

    mr.cyberfrog Jonagold

    Dabei seit:
    15.11.06
    Beiträge:
    20
    naja, im terminal gehe ich in das verzeichnis, wo sich der c++-code befindet und starte es mit
    g++ -L/usr/X11R6/lib -lX11 meinprogramm.cpp
    dann sollte sich was tun und mit dem befehl ./a.out wird es dann ausgeführt...

    mein projekt sieht halt so aus, dass ich die einzelnen programme (sind eigentliche nur kleine, eigenständige simulationen) über xcode schreibe und dann mit "build and go" ausführen lasse. bei den x11 simulationen meldet er mir "unknown link _X..." (halt die fehler von oben)


     
  12. below

    below Kalterer Böhmer

    Dabei seit:
    08.10.06
    Beiträge:
    2.865
    Ja, klar

    Das -lX11 musst Du ja auch Xcode sagen. Zieh die Datei /usr/X11R6/lib/X11 in die Gruppe "Link with Frameworks and Libraries" ziehen

    Und schick mir mal den Code, X11 programmierung hab ich komischerweise noch gar nicht gemacht. Das interessiert mich.

    Alex
     
  13. mr.cyberfrog

    mr.cyberfrog Jonagold

    Dabei seit:
    15.11.06
    Beiträge:
    20
    das musst mir nochma genau sagen, was ich bei xcode zu tun habe (sorry, hab aber überhaupt nicht gewusst was ich nun machen sollte ;)

    welche datei soll ich wo hinziehen??
    wo find ich "link with frameworks and libraries"??

    hab dir nen paar c++-codes mit x11 unterstützung als zip mit rangehängt. sind nicht meine, aber ganz ok...
     

    Anhänge:

    • x11.zip
      Dateigröße:
      9,2 KB
      Aufrufe:
      51
  14. below

    below Kalterer Böhmer

    Dabei seit:
    08.10.06
    Beiträge:
    2.865
    Wenn ich Bilder anhängen könnte, hätte ich ein Bild hier. Aber kann die Schritt für Schritt Erklärung bitte wer anders machen?

    Alex
     
  15. below

    below Kalterer Böhmer

    Dabei seit:
    08.10.06
    Beiträge:
    2.865
    Nachdem ich abs in fabs geändert habe sagt er mir immer noch: "XWindow has no member 'Plot'

    Alex
     
  16. mr.cyberfrog

    mr.cyberfrog Jonagold

    Dabei seit:
    15.11.06
    Beiträge:
    20
    meinst du das abs in der funktion
    double rnd(void){ return abs(rand()*1.0)/RAND_MAX; }

    es reicht, wenn du das abs komplett rausnimmst...
     
  17. below

    below Kalterer Böhmer

    Dabei seit:
    08.10.06
    Beiträge:
    2.865
    Das mit dem abs bekomme ich hin (abs ist für int, fabs ist für double)

    Aber die Plot methode fehlt mir :(

    Alex
     
  18. mr.cyberfrog

    mr.cyberfrog Jonagold

    Dabei seit:
    15.11.06
    Beiträge:
    20
    bei welchem programm hängts denn genau?? bei mir hauen soweit alle hin...
     
  19. below

    below Kalterer Böhmer

    Dabei seit:
    08.10.06
    Beiträge:
    2.865
    dla.cc, Zeilen 49, 75 und 82

    Alex
     
  20. mr.cyberfrog

    mr.cyberfrog Jonagold

    Dabei seit:
    15.11.06
    Beiträge:
    20
    wegen der xcode sache hab ich noch ein bisschen rumprobiert:

    links in der spalte "Groups and Files" auf mein projektnamen geklickt und dann add -> existing frameworks

    dort bin ich in das verzeichnis /usr/X11R6/lib/ gewechselt und hab die library libx11.a eingefügt

    soweit so gut ;) wenn ich dann meine x11 simulationen gestartet habe, bekam ich die fehlermeldung "### Error: Failed to open display !###", also eine fehlermeldung aus dem xwindows programm oben (sonst keine weiteren fehler). ich nehme an, xcode kann noch nicht auf den x11 server zugreifen, sprich ich habe bei den "environment variables" (unter excecutables) als name "DISPLAY" und als value "0.0" eingegeben, allerdings ohne erfolg...
     

Diese Seite empfehlen