PDA

View Full Version : [C++] Interfaccia e Linker


legolas93
05-02-2012, 14:23
Sto seguendo il manuale della Deitel solo che sono ad un punto morto.

Questa è l'interfaccia

GradeBook.h
#include <string>
using namespace std;

class GradeBook{
private:
string courseName;


public:
void setCourseName(string);
string getCourseName();

GradeBook(string);

};


Questo è la definizione dell'interfaccia

GradeBook.cpp
#include <iostream>
#include "GradeBook.h"
using namespace std;


void GradeBook::setCourseName(string name)
{
courseName = name;
}

string GradeBook::getCourseName()
{
return courseName;
}

GradeBook::GradeBook(string name)
{
setCourseName(name);
}



E questo è il sorgente con il Main

TestGradeBook.cpp
#include <iostream>
#include "GradeBook.h"

using namespace std;

int main()
{
GradeBook gradeBook1("corso 1");
GradeBook gradeBook2("corso 2");

cout << gradeBook1.getCourseName() << "\n" << gradeBook2.getCourseName();


return 0;
}


Se compilo tutti i file singolarmente funziona. Mentre se voglio generare l'eseguibile sull'ultimo listato mi da questo errore:

g++ -Wall -o "TestGradeBook" "TestGradeBook.cpp" (nella cartella: /home/andrea/Documenti/C++/GradeBook)
/tmp/ccleJ9bv.o: In function `main':
TestGradeBook.cpp:(.text+0x45): undefined reference to `GradeBook::GradeBook(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
TestGradeBook.cpp:(.text+0x92): undefined reference to `GradeBook::GradeBook(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
TestGradeBook.cpp:(.text+0xba): undefined reference to `GradeBook::getCourseName()'
TestGradeBook.cpp:(.text+0xcf): undefined reference to `GradeBook::getCourseName()'
collect2: ld returned 1 exit status
Compilazione fallita.


Ragazzi avete avete qualche idea? Mi sto perdendo in un bicchiere d'acqua? :muro:

Grazie! :)

marco.r
05-02-2012, 14:35
A differenza di altri linguaggi il linker non e' in grado di trovare i file che servono per il collegamento, devi indicarli tutti assieme.
Ad esempio se ad esempio hai compilato i file nel seguente modo

c++ -c GradeBook.cpp
c++ -c TestGradeBook.cpp

e ti ritrovi con i file GradeBook.o e TestGradeBook.o, per ottenere l'eseguibile devi scrivere

c++ GradeBook.o TestGradeBook.o -o TestGradeBook

Se invece stai usando un IDE, devi aggiungere semplicemente tutti i file all'elenco dei file del progetto

legolas93
05-02-2012, 15:14
A differenza di altri linguaggi il linker non e' in grado di trovare i file che servono per il collegamento, devi indicarli tutti assieme.
Ad esempio se ad esempio hai compilato i file nel seguente modo

c++ -c GradeBook.cpp
c++ -c TestGradeBook.cpp

e ti ritrovi con i file GradeBook.o e TestGradeBook.o, per ottenere l'eseguibile devi scrivere

c++ GradeBook.o TestGradeBook.o -o TestGradeBook

Se invece stai usando un IDE, devi aggiungere semplicemente tutti i file all'elenco dei file del progetto

Grazie :) :)

PS: cmq il fatto che non venga indicata questa cosa sul Deitel mi sembra una grave mancanza :read: