Undefined reference to constructeur de la classe, y compris .fichier cpp correctifs
Le problème que j'ai, c'est que, quand je l'appelle un constructeur pour une classe, j'ai créé, j'obtiens l'erreur suivante.
principal.rpc:20: undefined reference to
`StaticObject::StaticObject(Graphiques*, sf::String,
sf::Vector2)'
Ce problème peut être "fixe" ajouter un include pour le .fichier cpp dans main.cpp comme si.
...
#include "GameObjects/StaticObject.cpp"
...
Même si cela résout le problème, cela semble être une mauvaise solution et va à l'encontre de ce que j'ai déjà été dit. Est-il un autre moyen pour résoudre ce problème? Je suis à l'aide de Netbeans 7.3 avec g++ pour le code/compiler ce programme. Ci-dessous est le code pertinent.
main.cpp
...
#include <SFML/Graphics.hpp>
#include "Graphics/Graphics.hpp"
#include "GameObjects/StaticObject.hpp"
int main(int argc, char** argv) {
//SETUP
Graphics graphics;
background = new StaticObject(&graphics, "Data/Images/BackgroundPlaceholder.png", sf::Vector2f(0,0));
...
principal.php
...
#include <SFML/Graphics.hpp>
#include "GameObjects/StaticObject.hpp"
...
//Objects
StaticObject *background;
...
StaticObject.php
#include <SFML/Graphics.hpp>
#include "../Graphics/Graphics.hpp"
class StaticObject{
public:
StaticObject();
StaticObject(Graphics *_graphics, sf::String texture_filename, sf::Vector2f _position);
StaticObject(const StaticObject& orig);
virtual ~StaticObject();
private:
//The sprite stores the position
sf::Sprite *sprite;
sf::Texture *texture;
};
StaticObject.cpp
#include "StaticObject.hpp"
#include <SFML/Graphics.hpp>
#include "../Graphics/Graphics.hpp"
StaticObject::StaticObject(){
}
StaticObject::StaticObject(Graphics *_graphics, sf::String texture_filename, sf::Vector2f _position) {
sprite = _graphics->AddSprite(texture_filename);
sprite->setPosition(_position);
}
StaticObject::StaticObject(const StaticObject& orig) {
}
StaticObject::~StaticObject() {
}
Si j'ajoute la ligne suivante main.cpp, l'erreur disparaît.
#include "GameObject/StaticObject.cpp"
Quelqu'un peut-il expliquer:
-
Pourquoi cette solution résout le problème?
-
Pourquoi l' .le rpc n'a pas été inclus implicitement à travers notamment la .php
fichier? -
Est-il une meilleure manière de faire ceci?
- est GameObject/StaticObject.cpp inclus dans votre projet? n'a pas l'air comme c'est à partir de l'erreur
- Qu'entendez-vous par " dans le cadre du projet? Comme ci-dessus, en utilisant le #include a semblé résoudre le problème, mais il doit y avoir une meilleure façon. Je vous remercie par la route 🙂
- Ne pas inclure le rpc, le compiler et un lien vers le fichier de l'objet.
- y compris le fichier cpp, le compilateur pour générer ce code dans le cadre de ce fichier (que vous ne devriez pas le faire), ce que vous devez faire est de compiler le GameObject/StaticObject.cpp fichier comme son propre objet, et de relier les 2 objets. de quoi êtes-vous utiliser pour construire?
- Je viens de vérifier le projet NetBeans de l'arbre, et même si la classe a été faite à l'aide de NetBeans et là plus tôt, il semble avoir en quelque sorte retiré lui-même. Après re-ajouter les fichiers concernés, le problème a disparu. Merci beaucoup! Postez votre réponse et je vais le marquer comme étant la solution si c'est possible merci. 😀
Vous devez vous connecter pour publier un commentaire.
La
undefined reference
d'erreur indique que la définition d'une fonction/méthode (j'.e constructeur ici) n'a pas été trouvé par l'éditeur de liens.Et de la raison que l'ajout de la ligne suivante:
résout le problème, est qu'il apporte dans la mise en œuvre dans le cadre de la
main.cpp
alors que votre mise enStaticObject.cpp
. C'est un la mauvaise voie pour résoudre ce problème.Je n'ai pas utilisé Netbeans beaucoup, mais il devrait y avoir une option pour ajouter tous les .rpc fichiers en un seul projet, de sorte que Netbeans prend soin de lier tous les
.o
des fichiers en un seul fichier exécutable.Si
StaticObject.cpp
est intégré dans une bibliothèque de sa propre (je doute fort que ce soit le cas ici), alors vous pourriez avoir à spécifier le chemin d'accès de l'emplacement de cette bibliothèque, ainsi que l'éditeur de liens peut trouver la mise en œuvre.C'est ce qu'idéalement il se passe lorsque vous construisez votre programme:
Bien qu'il existe des moyens de gcc/g++ pour ignorer tous les intermédiaires .o fichier de générations et de générer directement les
main_program
, si vous spécifiez tous les fichiers sources (et les bibliothèques) dans la même ligne de commande.Le linker ne peut trouver la définition de
StaticObject
, ce qui signifie que vous n'avez pas compilé et lié StaticObject.cpp. Chaque .fichier cpp doit être compilé séparément, et les fichiers de l'objet, le compilateur produit pour chacune doit être donnée à l'éditeur de liens.La raison, y compris StaticObject.cpp dans Main.cpp fonctionne est que vous dites le préprocesseur pour insérer le contenu d'StaticObject.cpp en Main.cpp qui vous compilation, de sorte que les définitions de devenir une partie de Main.cpp's la sortie compilée.
y compris le fichier cpp, le compilateur pour générer ce code dans le cadre de ce fichier (que vous ne devriez pas le faire), ce que vous devez faire est de compiler le GameObject/StaticObject.cpp fichier comme son propre objet, et de relier les 2 objets.
Je ne sais pas beaucoup de netbeans, mais probablement GameObject/StaticObject.cpp n'est pas inclus dans les sources à compiler.
C'est pourquoi, si vous l'inclure manuellement à main.cpp il a trouvé le code source et tout est ok.
J'ai eu le même problème mais le mien était parce que je suis en utilisant Eclipse CDT avec et Autotools projet. J'ai donc dû ajouter manuellement le nouveau
.h
et.cpp
fichiers correspondantMakefile.am
, et puis faire un projet > reconfigurer projet, reconstruction, qu'il a été.