problem with g++ , linking problem



  • Soll nen Programm werden zur Menüsteuerung auf einem Palm als Display und Eingabegerät für nen kleinen Computer in einem DVD-Playergehäuse, an den kein Bildschirm und Tastatur usw. angeschlossen sind.
    Man soll halt per Palm Programme starten und Sachen einstellen können, wie zB. Lautstärke, Mp3s abspielen usw.

    Das Grundgerüst steht bereits, jetzt müsste man nur noch nen paar Objekte erzeugen und ich wollte das in mehrere Datein ausgliedern um Übersichtlichkeit zu bekommen.

    Hatte vorher schon 2 Methoden ausgelagert ohne Probleme. Nur wenn man Klassen auslagert und von diesen Klassen dann Objekte erzeugen möchte, meckert der immer rum, wenn die Dateien dann zusammengefügt werden sollen in eine Executable.



  • Ich bin ein fortgeschrittener Anfänger 🙄 ,
    wie meinst du Klassen ausgelagert? packst du sie in *.h Dateien?
    wenn ja däte ich das so machen:

    für jede Klasse eine *.h Datei (zb. Klasse1.h) für die Definitionen der Variablen, Klassen ,Strukturen usw. und eine *.cpp Datei (z.b Klasse1.cpp)
    für die Implementierung der Funktionen der Klasse1.

    Dann däte ich eine Header datei erstellen die alle Klassen includiert
    z.b HauptInclude.h

    Aber da das Grundgerüst schon steht kann dadurch alles dureinander gebracht werden. und:
    Du kannst eh viel besser C++ als ich ich muss noch lernen

    villeicht hilft dir das ja, und du kannst auch noch templates (Namensbereiche) benutzen (ich hab keine Ahnung wie man die verwendet aber kannst ja mal
    googeln).

    Gruß __stdcall*



  • nehmen wir mal einen fehler des linkers raus:

    er sagt, er findet die methode device::clear() nicht. normalerweise kommt der fehler beim linken dann, wenn man in der implementation der methode sowas schreibt:

    void clear(){
        //...
    }
    

    anstatt

    void device::clear(){
        //...
    }
    

    also schau nochmal in deinen *.cpp dateien, ob du auch immer den Klassen namen schön reingepackt hast, so einen fehler kann der compiler nicht finden.



  • I have made a small test program, that has the same failures...

    the main.cpp:

    #include <stdlib.h>
    #include <iostream>
    #include <stdio.h>
    #include <string.h>

    #include "testme.h"

    using namespace std;

    int main() {

    testme *test = new testme(5);

    test->modify(3);

    cout << test->getVar();

    }

    -----------------------------------

    the testme.cpp:

    class testme
    {
    private: int var;

    public:
    testme() {
    var = 0;
    }
    testme(int i) {
    var = i;
    }
    void modify(int i) {
    var = i;
    }
    int getVar() {
    return var;
    }
    };

    ------------------------------

    the testme.h :

    #ifndef testme_H
    #define tesme_H

    class testme
    {
    private: int var;

    public:
    testme();
    testme(int i);
    void modify(int i);
    int getVar();
    };

    #endif
    ------------------------------------------

    and the Makefile :

    testfile : main.o testme.o
    g++ main.o testme.o -o testfile

    main.o : main.cpp testme.h
    g++ -c main.cpp
    testme.o : testme.cpp
    g++ -c testme.cpp

    clean : rm main.o testme.o

    --------------------------------------------

    please tell me what i did wrong... writing testme:: in front of each class doesnt change anything... do i have to define a struct?

    THX 🙂



  • //the testme.h :
    //here is everything correct
    
    #ifndef testme_H
    #define testme_H
    
    class testme{
        private: 
            int var;
        public:
            testme();
            testme(int i);
            void modify(int i);
            int getVar();
    };
    
    #endif
    
    //the testme.cpp:
    //changed a few things
    
    #include "testme.h"
    
    testme::testme(int i) {
        var = i;
    }
    void testme::modify(int i) {
        var = i;
    }
    int testme::getVar() {
        return var;
    }
    


  • Well, there are serveral things to note:
    First of all you should declare your class in you headerfile , and only there.
    ( you did it in both header and source file.)
    Second of all you should include your header in your source :
    include "testme.h" in testme.cpp ... these changes would chance the code to
    become like this:

    the main.cpp:
    
    #include <iostream>
    #include "testme.h"
    
    using namespace std;
    
    int main() {
    
    	testme *test = new testme(5);
    	test->modify(3);
    	cout << test->getVar();
    	return 0;
    }
    

    -----------------------------------

    the testme.cpp:
    #include"testme.h"
    
    testme::testme() {
    	var = 0;
    }
    testme::testme(int i) {
    	var = i;
    }
    void testme::modify(int i) {
    	var = i;
    }
    int testme::getVar() const{
    	return var;
    }
    

    ------------------------------

    the testme.h :
    #ifndef testme_H
    #define tesme_H
    
    class testme
    {
    private: int var;
    
    public:
    testme();
    testme(int i);
    void modify(int i);
    int getVar();
    };
    
    #endif
    

    then i would recommend you to have a look at "initialisation-lists" and "default parameters"...

    this could change your code into:

    the testme.cpp:
    #include"testme.h"
    
    void testme::modify(int i) {
    	var = i;
    }
    int testme::getVar() {
    	return var;
    }
    

    ------------------------------

    the testme.h :
    #ifndef testme_H
    #define testme_H
    
    class testme
    {
    private: int var;
    
    public:
    testme(int i=0):var(i){}
    void modify(int i);
    int getVar()const;// because you dont change any part of the class
    };
    
    #endif
    

    //edit sry otze hab einfach solang geschrieben das ich nicht wusste das dein
    post schon existiert...



  • Vielen Dank.. es klappt jetzt alles 🙂

    nur eine kleine Frage noch.. woher kommt dieser fehler:
    warning: no newline at end of file
    in bezug auf die headerfile



  • drück am ende der datei einfach nochmal enter und gut ist 😉



  • und wo ich gerade dabei bin 😉

    wie kriege ich den fehler hier weg:

    sound.cpp: In member function char* sound::getChannelVolume()': sound.cpp:88: warning: address of local variableproz_ret' returned

    iss auch nur nen warning.. aber will keine warnings haben 🙂

    iss doch richtig das die adresse auf die variable zurückgegeben wird... so solls auch sein 😞

    oder verstehe ich da was falsch



  • du kannst keine addressen von variablen zurückgeben die nur ind er funktion existieren. In dem fall musst du kopieren


Anmelden zum Antworten