Namepspaces in Verzeichnishierarchie darstellen



  • mh..

    util::position::position::func(...)

    ist da jetzt nicht ein "position::" zuviel reingerutscht?



  • borg schrieb:

    util::position::position::func(...)

    ist da jetzt nicht ein "position::" zuviel reingerutscht?

    Eigentlich nicht.
    namespace und klasse:
    util::position::position::func(...)

    Wenn ein "position::" zuviel drinnen wäre, dann hätte ich es nicht kompilieren können (, oder?).



  • namespace und klasse dürfen nicht gelich heissen (nichts darf gleich heissen!!!)



  • Ok, das wusste ich nicht..
    Ist aber auch schade, da muss man sich wieder gedanken um Namen machen... 🙂

    Aber das hilft leider nichts.
    Ich hab das nun mal geändert. Die Klasse position ist nun direkt im namespace util drin.
    Und alles was damit zusammenhängt abgeändert (Pfade und Einträge in Dateien).

    //position.h 
    #ifndef POSITION_H__
    #define POSTTION_H__
    namespace util
    {
      struct pos
      {
        int pos1;
        int pos2;
      };
      typedef struct pos pos;
    
      class position
      {
      public:
        position(int, int);
        position(const struct pos&);
        position();
        virtual  ~position();
    
        pos getPosition() const ;
        void getPosition(int*, int*) const;
    
      //    void setPosition(int&, int&);
      //    void setPosition(const pos&);
    
      //    void setPositionDelta(int&, int&);
    
      private:
        int m_npos1;
        int m_npos2;
      };
    }
    #endif
    
    //position.cpp
    #include "position.h"
    
    using namespace util;
    
    position::position()
    {
      position::position(0,0);
    }
    
    position::position(int a, int b)
    {
      m_npos1 = a;
      m_npos2 = b;
    }
    
    position::position(const pos& a)
    {
      position(a.pos1, a.pos2);
    }
    
    position::~position() {}
    
    void position::getPosition(int* a, int* b) const
    {
      if(!a || !b)
        return;
    
      *a = m_npos1;
      *b = m_npos2;
    }
    
    pos position::getPosition() const
    {
      pos posi;
      posi.pos1 = m_npos1;
      posi.pos2 = m_npos2;
      return posi;
    }
    
    // hui.cpp
    #include <util/position.h>
    #include <iostream>
    
    using util::position;
    using util::pos;
    
    int main()
    {
        position Pos(7,8);
        pos __POSI = Pos.getPosition();
    
        std::cout << __POSI.pos1 << " " << __POSI.pos2 << std::endl;
        return 0;
    }
    

    Die Dateien position.h und position.o habe ich natürlich in mein angepasstes include Verzeichnis kopiert.

    Der Code wird immer fehlerfrei kompiliert...
    ..dennoch bekomme ich diese Aussgabe:

    [test] g++ -c hui.cpp -I $JO_INCLUDE 
    [test] g++ -o hui hui.o
    hui.o(.text+0x134): In function `main':
    : undefined reference to `util::position::position(int, int)'
    hui.o(.text+0x146): In function `main':
    : undefined reference to `util::position::getPosition() const'
    hui.o(.text+0x198): In function `main':
    : undefined reference to `util::position::~position()'
    hui.o(.text+0x1b2): In function `main':
    : undefined reference to `util::position::~position()'
    collect2: ld gab 1 als Ende-Status zurück
    

    An was kann das liegen?



  • mach
    g++ *.c -o programm
    nich -c verwenden ausser du weisst was du tust



  • Na ich dachte, mit
    g++ -c bla.cpp
    kompiliere ich mir das zu einer .o .
    Und am Schluß kann ich die dann alle per
    g++ *.o -o programm
    kompilieren..

    Und nur g++ *.cpp -o hui -I $JO_INCLUDE langt auch nicht..

    [test] g++ *.cpp -o hui -I $JO_INCLUDE 
    /tmp/ccFlz0sn.o(.text+0x134): In function `main':
    : undefined reference to `util::position::position(int, int)'
    /tmp/ccFlz0sn.o(.text+0x146): In function `main':
    : undefined reference to `util::position::getPosition() const'
    /tmp/ccFlz0sn.o(.text+0x198): In function `main':
    : undefined reference to `util::position::~position()'
    /tmp/ccFlz0sn.o(.text+0x1b2): In function `main':
    : undefined reference to `util::position::~position()'
    collect2: ld gab 1 als Ende-Status zurück
    

    Ich bin ratlos.



  • Wenn ich die "position.o" direkt angebe, dann wird es gelinkt und funktioniert.

    g++ hui.cpp -o hui -I $JO_INCLUDE $JO_INCLUDE/util/position.o
    

    Jetzt werde ich mal schauen, ob ich da nicht einen Parameter finde, dass der g++ die Libs/*.o aus dem $JO_INCLUDE suchen soll.



  • hehejo schrieb:

    Na ich dachte, mit
    g++ -c bla.cpp
    kompiliere ich mir das zu einer .o .
    Und am Schluß kann ich die dann alle per
    g++ *.o -o programm
    kompilieren..

    Object datein tut man nicht zusammen kompilieren sonder verlinken
    verwende das programm "ld"(ist bei den binutils dabei!!
    und ich bleib weiter dabei das g++ ohne "-c" eine exetuable im format a.out macht(linux)

    mfg



  • 😕

    Also ich weiß etz im Moment nicht weiter.
    Die Ausgabedatei ist mir egal. Ob nun a.out oder hui...

    Der g++ findet dank -I $JO_INCLUDE zwar die Datei <util/position.h> aber leider nicht die dazugehörige "position.o", die er in der Linkerphase braucht um alles ordentlich zu linken.

    Wenn ich die position.o mit angebe, dann funktioniert das Linken ja ohne Probleme.

    Leider ist die manpage zum gcc recht groß.
    Darum werde ich wohl etwas länger suchen müssen, bis ich raus habe, welchen Schalter er (gcc) noch braucht, damit er die position.o findet.

    -lposition.o hat nichts gebracht.



  • g++ -c src.cpp 
    g++ src.o -o src.exe
    

    der g++ ruft dann automatisch ld auf.

    Wie kann man eigentlich projekte mit mehreren dateien miteinander kompilieren, ohne den weg über objectfiles? direkt kompilieren führt immer zu undefined references. habe ich da etwa elementare grundkonzepte missverstanden? O_o

    mfg


Anmelden zum Antworten