undefined reference to `atexit'



  • Hallo zusammen,

    ich habe folgenden Code:

    class A
    {
        public:
            ~A() {}
    };
    
    class B
    {
        private:
            A a;
    
        public:
            static B& GetInstance()
            {
                static B instance;
                return instance;
            }
    };
    

    Beim linken bekomme ich folgende Fehlermeldung in Zeile 15:

    undefined reference to `atexit'
    

    Ich baue den Code für einen Arduino Leonardo mit dem Eclipse-Arduino-Plugin und der Arduino Bibliothek.

    Ich hab das Beispiel mal auf ein Minimum runtergebrochen, bei dem der Fehler noch zu reproduzieren ist.
    Klasse B soll ein Singleton werden. Das Problem scheint der Destruktor von Klasse A zu sein. Entferne ich ihn, dann klappt es. Was mache ich falsch?

    THX



  • Jester2000 schrieb:

    Was mache ich falsch?

    du postest nicht den relevanten Code. Mit dem Beispiel it der Fehler nicht nachvollziehbar.



  • Danke für die schnelle Antwort.

    Wenn ich mit obigen Code

    B::GetInstance();
    

    aufrufe, dann kommt der Error.


  • Mod

    Jester2000 schrieb:

    Danke für die schnelle Antwort.

    Wenn ich mit obigen Code

    B::GetInstance();
    

    aufrufe, dann kommt der Error.

    Nein, kommt er nicht. Oh, ich bezweifle nicht, dass du den Fehler bekommst. Aber nicht mit dem gezeigten Code. Siehe den dritten Link in meiner Signatur.

    edit: Eine exotische Möglichkeit gibt es noch: Linkst du das irgendwie komisch? Sieht so aus als würdest du die Standardbibliothek nicht mitlinken. Wie genau erstellst du das Programm? Falls das der Compiler GCC im Zusammenspiel mit dem Linker ld ist (was ich von der Fehlermeldung her vermute), könnte dies dadurch geschehen, dass du das C-Frontend (gcc) statt das C++-Frontend (g++) benutzt.



  • Nein, da kommt kein Error:

    guckst du hier



  • Ich hab einfach ein neues Arduino-Projekt erstellt (über das Arduino-Plugin), das Board und den Port definiert, und den Rest erledigt das Arduino-Plugin für mich (oder auch nicht 😞 )

    Folgende Ausgabe hab ich auf der Konsole:

    Building file: ../Main.cpp
    Invoking: AVR C++ Compiler
    avr-g++ -I"D:\Apps\arduino-1.0.4\hardware\arduino\cores\arduino" -I"D:\Apps\arduino-1.0.4\hardware\arduino\variants\leonardo" -I"D:\Projects\Workspaces\Arduino\Test2" 
    -D__IN_ECLIPSE__=1 -DUSB_VID=0x2341 -DUSB_PID=0x8036 -DARDUINO=104 -Wall -Os -ffunction-sections -fdata-sections -fno-exceptions -g -mmcu=atmega32u4 -DF_CPU=16000000UL 
    -MMD -MP -MF"Main.d" -MT"Main.d"  -c -o "Main.o" -x c++ "../Main.cpp"
    ./Main.o: In function `B::GetInstance()':
    D:\Projects\Workspaces\Arduino\Test2\Release/../Main.cpp:16: undefined reference to `atexit'
    make: *** [Test2.elf] Error 1
    Finished building: ../Main.cpp
    

    Bin noch neu auf dem Arduino-Gebiet und war deshalb froh, das mir das Plugin die Arbeit so erleichtert. Nur stehe ich jetzt vor diesem Problem.


  • Mod

    Füg mal den Schalter -fno-use-cxa-atexit hinzu.



  • Der Schalter -fno-use-cxa-atexit hat leider nicht das Problem behoben, aber der Schalter -nostdlib im Linker hat zum Erfolg geführt.

    Danke für eure Mühe und den Denkanstoß, das etwas mit den Compiler/Linker-Einstellungen nicht richtig war.


Anmelden zum Antworten