Fichiers d'en-tête C ++ - Ce qu'il faut inclure
J'ai écrit une classe très simple en C++, à savoir qu'il est la classe Rectangle de http://www.cplusplus.com/doc/tutorial/classes/. En particulier, voici le contenu du fichier d'en-Tête (Rectangle.h):
#ifndef RECTANGLE_H
#define RECTANGLE_H
class Rectangle {
private:
double m_x;
double m_y;
public:
Rectangle();
Rectangle(double, double);
void setXY(double, double);
double getArea();
};
#endif
Ici est la mise en œuvre (Rectangle.cpp):
#include "Rectangle.h"
Rectangle::Rectangle() {
setXY(1, 1);
}
Rectangle::Rectangle(double x, double y) {
setXY(x, y);
}
void Rectangle::setXY(double x, double y) {
m_x = x;
m_y = y;
}
double Rectangle::getArea(void) {
return m_x * m_y;
}
Maintenant, je suis censé inclure l'en-Tête de Rectangle dans ma classe principale, c'est:
#include <stdlib.h>
#include <iostream>
#include "Rectangle.h"
using namespace std;
int main(void) {
Rectangle a;
cout << "Area : " << a.getArea() << "\n";
return EXIT_SUCCESS;
}
Mais, ensuite, j'obtiens l'erreur:
make all
g++ -O2 -g -Wall -fmessage-length=0 -c -o Chung1.o Chung1.cpp
g++ -o Chung1 Chung1.o
Chung1.o: In function `main':
/home/chung/eclipse_ws/Chung1/Chung1.cpp:8: undefined reference to `Rectangle::Rectangle()'
/home/chung/eclipse_ws/Chung1/Chung1.cpp:9: undefined reference to `Rectangle::getArea()'
collect2: ld returned 1 exit status
make: *** [Chung1] Error 1
L'erreur est résolue si j'inclus le fichier Rectangle.cpp au lieu de cela. (Je suis en cours d'exécution sur Eclipse)
Suis-je censé inclure le fichier CPP au lieu de cela, après tout?
Voici mon Makefile:
CXXFLAGS = -O2 -g -Wall -fmessage-length=0
OBJS = Chung1.o
LIBS =
TARGET = Chung1
$(TARGET): $(OBJS)
$(CXX) -o $(TARGET) $(OBJS) $(LIBS)
all: $(TARGET)
clean:
rm -f $(OBJS) $(TARGET)
run: $(TARGET)
./$(TARGET)
Comment puis-je le modifier pour compiler la classe Rectangle?
Solution: en Fonction de la réponse de l'utilisateur v154c1, il est nécessaire de compiler individu fichiers cpp et de l'inclure leurs têtes dans le fichier principal ou dans n'importe quel autre fichier où cette fonctionnalité est nécessaire. Voici un exemple de Makefile pour le faire:
CXXFLAGS = -O2 -g -Wall -fmessage-length=0
#List of dependencies...
OBJS = Rectangle.o Chung1.o
LIBS =
TARGET = Chung1
$(TARGET): $(OBJS)
$(CXX) -o $(TARGET) $(OBJS) $(LIBS)
all: $(TARGET)
clean:
rm -f $(OBJS) $(TARGET)
run: $(TARGET)
./$(TARGET)
source d'informationauteur Pantelis Sopasakis | 2012-11-18
Vous devez vous connecter pour publier un commentaire.
Vous n'êtes pas compilation et la liaison de la classe Rectangle.
Votre compilation devrait ressembler à:
Si vous utilisez Makefile, puis il suffit d'ajouter le Rectangle.cpp de la même façon que vous utilisez Chung1.cpp. Il en va de même pour n'importe quel IDE que vous utilisez peut-être.
Non, vous n'êtes pas censé inclure les
.cpp
. Vous devrez le compiler, ce qui devrait produire un.o
fichier qui est ensuite lié à l'exécutable principal. Votre principale est de ne pas en trouver et lien vers cette.o
fichier pour quelque raison que ce soit. Sans savoir exactement compilation et la liaison mesures que vous prenez, il est difficile d'en dire plus.Généralement l' .h fichier est la définition de la classe, de sorte que vous êtes en droit. Je ne pense pas que vous avez inclus "Rectangle.h" dans les options du compilateur.