Keine Symbols im Object-File, Linker unzufrieden

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

  • Keine Symbols im Object-File, Linker unzufrieden

    Hallo,

    ich versuche gerade mein Programm mit GCC 4.4.3 zu kompilieren und bekomme folgenden Fehler:

    Quellcode

    1. imp@imp-desktop:~$ make all -C dev/c/projects/FacilityKontrola/build/
    2. make: Entering directory `/home/imp/dev/c/projects/FacilityKontrola/build'
    3. Building target: facilitykontrola
    4. Invoking: GCC C++ Linker
    5. g++ -o"facilitykontrola" ./src/main.o ./src/classes/Kontrola/Component.o ./src/classes/Kontrola/ComponentController.o ./src/classes/Kontrola/NotificationSystem.o
    6. ./src/main.o: In function `main':
    7. main.cpp:(.text+0x3d): undefined reference to `NotificationSystem<int>::NotificationSystem()'
    8. collect2: ld returned 1 exit status
    9. make: *** [facilitykontrola] Error 1
    10. make: Leaving directory `/home/imp/dev/c/projects/FacilityKontrola/build'

    Quellcode: pastebin.com/t2ZYA2gS

    "src/classes/Kontrola/NotificationSystem.cpp" kompiliert ohne Fehler und "nm main.o" zeigt mir auch den U-Eintrag, der auf das dekorierte "_ZN18NotificationSystemIiEC1Ev" verweist.
    Wenn ich mir aber "nm NotificationSystem.o" angucke, zeigt er mir kein einziges Symbol, obwohl der Quellcode in "NotificationSystem.cpp" zu einigen Symbols führen müsste. Damit der Linker befriedigt wird muss "NotificationSystem.cpp" ordentlich kompiliert werden.

    Was mach ich da falsch?

    Quellcode

    1. g++ -O3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/classes/Kontrola/NotificationSystem.d" -MT"src/classes/Kontrola/NotificationSystem.d" \
    2. -o"src/classes/Kontrola/NotificationSystem.o" "../src/classes/Kontrola/NotificationSystem.cpp"


    MfG
    IMP, out.
  • .d-Files sind in diesem Fall Dependencies also Abhängigkeiten. Im Moment builde ich auf und für Linux 3.2.9 x86_64 mit GCC 4.4.3.

    Der Inhalt sieht so aus:

    Quellcode

    1. src/classes/Kontrola/NotificationSystem.d \
    2. src/classes/Kontrola/NotificationSystem.o: \
    3. ../src/classes/Kontrola/NotificationSystem.cpp \
    4. ../src/classes/Kontrola/NotificationSystem.h
    5. ../src/classes/Kontrola/NotificationSystem.h:

    -MF gibt die Abhängigkeiten für das aktuelle Ziel an.
    -MT macht, dass die Abhängigkeiten auf die Ziele in der angegeben Datei angewendet werden.
    Ganz sicher bin ich mir nicht, aber du kannst es ja in den man-pages noch einmal genauer nachlesen.

    Mir ist übrigens aufgefallen, dass der Fehler nur auftritt wenn ich in der Datei mit Templates arbeite. Hab ich da was falsch gemacht?

    MfG
    IMP, out.
  • Ich tummele mich da kaum bei Templates.

    War da nicht etwas was mit der Aufteilung zwischen ?.cpp und ?.h anders, als bei den meisten anderen Projekten?

    Laienhaft; solltest du die .cpp und die .h nicht in eine .h Datei zusammenführen?
    Nein nicht die 'main.cpp' . Die anderen beiden.

    Schreib mal, wie das aus geht.

    MfG bcc-fan

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von bcc-fan ()

  • Ah, jetzt ist es sinnvoll. Nach dem ich auf cplusplus.com/doc/tutorial/templates/ den unteren Abschnitt gelesen habe, werden mir auch die .tcc-Files in der stdlib erschlüssig.

    @bcc-fan:
    Die Code-Unit (.c, .t, .cpp, .tcc) bzw. die Implementierung des Templates muss in den eigentlichen Quellcode #included werden, wie du das schon angedeutet hast. Danke dafür!
    So wie ich das sehe, kann NotificationSystem.cpp sofern ich da nur das Template drin lasse vom Buildprozess ausgeschlossen werden.

    @Rushh0ur:
    Die Templates sehen duch meine schreibfaule Art etwas makrolastig aus, sind aber konform.

    MfG
    IMP, out.