c++ link error: undefined symbols

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • c++ link error: undefined symbols

    hallo liebe mac os x entwickler

    ich versuche nun schon fast eine woche den opengl glut kontext mit c++ zum laufen zu bringen. das ist was mein linker dazu sagt:

    Quellcode

    1. ld: Undefined symbols:
    2. drawGLScene()
    3. resizeGLScene(int, int)
    4. initGL()

    und der code dazu: main.h:

    Quellcode

    1. #ifndef MAIN_H
    2. #define MAIN_H
    3. GLvoid initGL(GLvoid);
    4. GLvoid drawGLScene(GLvoid);
    5. GLvoid resizeGLScene(int Width, int Height);
    6. #endif

    und main.cpp:

    C-Quellcode

    1. #include <iostream>
    2. using namespace std;
    3. #include <OpenGL/gl.h>
    4. #include <OpenGL/glu.h>
    5. #include <GLUT/glut.h>
    6. #include "main.h"
    7. #define kWindowWidth 400
    8. #define kWindowHeight 300
    9. int main (int argc, const char * argv[]) {
    10. glutInit(&argc, argv);
    11. glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    12. glutInitWindowSize(kWindowWidth, kWindowHeight);
    13. glutInitWindowPosition(100, 100);
    14. glutCreateWindow(argv[0]);
    15. initGL();
    16. glutDisplayFunc(*drawGLScene);
    17. glutReshapeFunc(*resizeGLScene);
    18. glutMainLoop();
    19. return 0;
    20. }
    Alles anzeigen

    vielleicht kann mir wer helfen,
    lg, joedelord
  • ich glaube das stimmt schon. ist ein glut eigenheit. in der glut.h steht :

    Quellcode

    1. void glutDisplayFunc(void (*func) (void));

    und in der referenz steht als bemerkung

    Quellcode

    1. func - the new display callback function

    ich bin eine bischen ratlos :(

    lg, joedelord
  • Original von joedelord
    ich glaube das stimmt schon. ist ein glut eigenheit. in der glut.h steht :

    Quellcode

    1. void glutDisplayFunc(void (*func) (void));

    Diese Funktion ist nicht das Problem. Du hast in "main.h" diese drei Funktionen deklariert:

    Quellcode

    1. GLvoid initGL(GLvoid);
    2. GLvoid drawGLScene(GLvoid);
    3. GLvoid resizeGLScene(int Width, int Height);
    Der Linker findet aber diese Funktionen nicht, weil Du sie eben nur deklariert, aber nicht definiert hast.

    Michael
  • mit
    void glutDisplayFunc(void (*func) (void));
    ist gemeint, dass Du dem Framework einen Pointer auf eine Funktion übergibst, die dann zu den passenden Events (Zeichenen, Größenänderung der Views usw.) aufgerufen werden. Die Funktionen muss Du schon selbst schreiben und mit 'Leben' füllen.
    Die Funktion, die Du mit obigem Aufruf registrierst wird dann zum Zeichnen aufgerufen.
    So macht man das eben in C, wenn man keine Polymorphie hat.
    (wenn Du damit wirklich soo große Probleme hast, solltest Du dringend Deine C-Kenntnisse auf-/ausbauen)
  • Original von joedelord
    ich glaube das stimmt schon. ist ein glut eigenheit. in der glut.h steht :

    Quellcode

    1. void glutDisplayFunc(void (*func) (void));

    und in der referenz steht als bemerkung

    Quellcode

    1. func - the new display callback function

    ich bin eine bischen ratlos :(

    lg, joedelord


    Was hat das eine mit dem anderen zu tun?
  • so, ihr werdet es nicht glaube... hauptproblem geloest! es waren wirklich die fehlenden funktionsdeklartionen. die ganzen fehler meldungen sind weg, das glut fenster geht auf zeigt aber nichts an. es ignoriert irgendwie alle gl befehle.

    danke fuer die hilfe, joedelord
  • Original von joedelord
    so, ihr werdet es nicht glaube... hauptproblem geloest! es waren wirklich die fehlenden funktionsdeklartionen. die ganzen fehler meldungen sind weg, das glut fenster geht auf zeigt aber nichts an. es ignoriert irgendwie alle gl befehle.


    Neee neee neee.
    Du hattest ja Funkionsdeklaratitionen, aber KEINE Funktionsdefinitionen.

    Deklarieren heißt: dem Compiler sagen - dieses Objekt (Funktion oder Variable) gibt es. Das ist nötig, damit der Kompiler weiß, die Funktion wurde definiert, aber woanders (Library, anderes Modul), er setzt dafür Sprünge an einen stub (mit Relocation-Info), der später vom Linker aufgelöst wird.

    Definieren heißt: da ist die Funktion, hier steht, was zu machen ist. Der Linker ersetzt dann alle Aufrufe der Funktion (dem stub vom Kompiler) in Sprünge an die Adresse der hier definierten Funktion (dazu braucht er die Relocation Infos).

    Wirf dazu doch mal einen Blick in den Kernighan & Ritchie - kann nicht schaden. Nimm die englische Fassung, die Übersetzung ist da nicht ganz so eindeutig.

    Ohne die Deklarationen kannst du dem Glut auch keine Callbacks geben. Woher soll dann der Inhalt kommen? Mit Deklarationen bekommst Du Linker-Fehler. Was ist zu tun (wie bereits von anderen erwähnt):
    1. Definiere die Funktionen
    2. Setze sie als CallBack Funktionen
    Dann sollten deine Funktionen aus der OpenGL Glut-Library aufgerufen werden, sobald was zu tun ist.