Compilerfehler - undefined reference to



  • Hallo,

    beim compilieren meines Programms erhalte ich für mich einen unerklärlichen Compilerfehler.

    Hier erstmal ein Codeausschnitt:

    Header

    #include "DataStreamHandler.h"
    #include "MeasureHandler.h"
    
    #include <boost/thread.hpp>
    
    namespace std {
    
    class Worker {
    public:
    	Worker(DataStreamHandler& dsh, unsigned channels);
    	virtual ~Worker();
    	void doWork();
    	void init();
    	void kill();
    
    private:
    	DataStreamHandler dsh;
    	volatile bool stoprequested;
    	bool dead;
    
    	DataStorage *data;   
    
    	MeasureHandler *mh;
    	unsigned int channles;
    	boost::thread thread;
    
    };
    
    }
    

    Source:

    Worker::Worker(DataStreamHandler& dsh, unsigned channels) : stoprequested(false){
    .
    .
    .
    }
    
    **** Build of configuration Analyzer_Server for project Analyzer_Server ****
    
    make all 
    Building file: ../src/Analyzer_Server.cpp
    Invoking: GCC C++ Compiler
    g++ -I/usr/local/natinst/nidaqmxbase/include -I/usr/local/boost -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/Analyzer_Server.d" -MT"src/Analyzer_Server.d" -o  "src/Analyzer_Server.o" "../src/Analyzer_Server.cpp"
    Finished building: ../src/Analyzer_Server.cpp
    
    Building file: ../src/Model.cpp
    Invoking: GCC C++ Compiler
    g++ -I/usr/local/natinst/nidaqmxbase/include -I/usr/local/boost -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/Model.d" -MT"src/Model.d" -o  "src/Model.o" "../src/Model.cpp"
    Finished building: ../src/Model.cpp
    
    Building file: ../src/Worker.cpp
    Invoking: GCC C++ Compiler
    g++ -I/usr/local/natinst/nidaqmxbase/include -I/usr/local/boost -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/Worker.d" -MT"src/Worker.d" -o  "src/Worker.o" "../src/Worker.cpp"
    Finished building: ../src/Worker.cpp
    
    Building target: Analyzer_Server
    Invoking: GCC C++ Linker
    g++ -L/usr/local/boost/stage/lib -o  "Analyzer_Server"  ./src/Analyzer_Server.o ./src/CommunicationHandler.o ./src/Configuration.o ./src/DataBlock.o ./src/DataHandler.o ./src/DataStorage.o ./src/DataStreamHandler.o ./src/Header.o ./src/MeasureHandler.o ./src/Model.o ./src/ServerSocket.o ./src/Socket.o ./src/StringUtility.o ./src/Test.o ./src/Worker.o   -lboost_thread -lnidaqmxbase
    /usr/bin/ld: warning: libstdc++.so.5, needed by /usr/local/lib/liblvrtdark.so.8.2, may conflict with libstdc++.so.6
    ./src/Worker.o: In function `Worker':
    /home/viktor/workspace/Analyzer_Server/Analyzer_Server/../src/Worker.cpp:15: undefined reference to `std::DataStreamHandler::DataStreamHandler()'
    /home/viktor/workspace/Analyzer_Server/Analyzer_Server/../src/Worker.cpp:15: undefined reference to `std::DataStreamHandler::DataStreamHandler()'
    collect2: ld gab 1 als Ende-Status zurück
    make: *** [Analyzer_Server] Fehler 1
    

    Wird die Deklaration der Klassenattribute "dsh" in Zeile 17 auskommentiert, tritt der Fehler nicht mehr auf.

    Jemand eine Idee wie der Fehler zu Stande kommt?

    Gruß
    Viktor



  • Es ist vom Standard nicht erlaubt, etwas im namespace std zu definieren. Wundert mich dass der Compiler dir da nicht ins Gesicht springt.

    Was den Linkerfehler angeht den du da hast: du hast für Datastreamhandler offenbar einen Default-Konstruktor deklariert, aber nicht definiert. Im Konstruktor von Worker wird das Member default-initialisiert, und der Linker findet auch in datastreamhandler.o den Konstruktor-Code nicht.



  • pumuckl schrieb:

    Es ist vom Standard nicht erlaubt, etwas im namespace std zu definieren.

    wäre auch gruselig, wenn jeder im Namespace std herumprogrammiert.

    pumuckl schrieb:

    Wundert mich dass der Compiler dir da nicht ins Gesicht springt.

    ähem, bist Du sicher das der Compiler weiß, das std ein besonderer Namespace ist?

    Also exagi, schnell einen eigenen Namespace schaffen und den fehlenden Konstruktor proggen. Die Fehlermeldung ist eindeutig.

    tschüß
    Troll.Soft



  • Troll.Soft schrieb:

    ähem, bist Du sicher das der Compiler weiß, das std ein besonderer Namespace ist?

    Der Compiler sollt nicht erlauben was der Standard verbietet.



  • pumuckl schrieb:

    Der Compiler sollt nicht erlauben was der Standard verbietet.

    Kennst du einen Compiler, der das erkennt? So eine Regel dürfte relativ mühsam für Implementierer sein, da sie selber sehr viele nicht zum Standard zugehörige Bezeichner in std haben (bei MSVC++ z.B. mit Unterstrich und Grossbuchstaben).

    Templates-Spezialisierungen im Namensraum std sind übrigens erlaubt (z.B. für swap() ).



  • Nexus schrieb:

    Kennst du einen Compiler, der das erkennt?

    jetzt wo ichs ausprobiert hab - nein. Ich habs nie versucht und war fälschlicherweise davon ausgegangen dass Compiler da entsprechend unterscheiden könnten...


Anmelden zum Antworten