Undefined ссылка на конструктор классов, включая исправления файла .cpp
Проблема, с которой я столкнулась, заключается в том, что когда я вызываю конструктор для созданного класса, я получаю следующую ошибку.
main.cpp: 20: undefined ссылка на `StaticObject:: StaticObject (Graphics *, sf:: String,
научная фантастика:: Vector2)
Эта проблема может быть "исправлена", добавив в файл .cpp include в файле main.cpp так.
...
#include "GameObjects/StaticObject.cpp"
...
Хотя это решает проблему, это кажется плохим решением и противоречит тому, что я ранее говорил. Есть ли другой способ решить эту проблему? Я использую Netbeans 7.3 с g++ для кодирования/компиляции этой программы. Ниже приведен соответствующий код.
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));
...
main.hpp
...
#include <SFML/Graphics.hpp>
#include "GameObjects/StaticObject.hpp"
...
// Objects
StaticObject *background;
...
StaticObject.hpp
#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() {
}
Если я добавлю следующую строку в main.cpp, ошибка исчезнет.
#include "GameObject/StaticObject.cpp"
Может кто-нибудь объяснить:
-
Почему это устраняет проблему?
-
Почему .cpp не был неявно включен через включение .hpp
файл?
-
Есть ли лучший способ сделать это?
Ответы
Ответ 1
Ошибка undefined reference
указывает, что определение функции/метода (то есть конструктора здесь) не было найдено компоновщиком.
StaticObject::StaticObject(Graphics*, sf::String, sf::Vector2<float>)
И причина, по которой добавлена следующая строка:
#include "GameObject/StaticObject.cpp"
исправляет проблему, вносит ли она реализацию как часть main.cpp
, тогда как ваша фактическая реализация находится в StaticObject.cpp
. Это неправильный способ , чтобы устранить эту проблему.
Я не использовал Netbeans много, но должен быть возможность добавить все .cpp файлы в один проект, чтобы Netbeans позаботился о том, чтобы связать все файлы .o
в один исполняемый файл.
Если StaticObject.cpp
встроен в собственную библиотеку (я очень сомневаюсь, что это так), вам может потребоваться указать путь к местоположению этой библиотеки, чтобы компоновщик мог найти реализацию.
Это то, что в идеале происходит при создании вашей программы:
Compile: StaticObject.cpp -> StaticObject.o
Compile: main.cpp -> main.o
Link: StaticObject.o, main.o -> main_program
Хотя в gcc/g++ есть способы пропустить все промежуточные поколения .o файлов и напрямую сгенерировать main_program
, если вы укажете все исходные файлы (и любые библиотеки) в той же командной строке.
Ответ 2
включая файл cpp, заставляет компилятор создавать этот код как часть этого файла (чего вам не следует делать), вам нужно скомпилировать файл GameObject/StaticObject.cpp как свой собственный объект и связать 2 объекты вместе.
Ответ 3
Компонент не может найти определение для StaticObject
, что означает, что вы не скомпилировали и не связали StaticObject.cpp. Каждый .cpp файл должен быть отдельно скомпилирован, а объектные файлы, создаваемые компилятором для каждого, должны быть предоставлены компоновщику.
Причина, включающая StaticObject.cpp в Main.cpp, заключается в том, что вы сообщаете препроцессору вставить содержимое StaticObject.cpp в файл Main.cpp, который вы компилируете, поэтому определения становятся частью скомпилированного вывода Main.cpp.
Ответ 4
Я не знаю много netbeans, но, вероятно, GameObject/StaticObject.cpp не входит в состав компиляции источников.
Поэтому, если вы включили его вручную в main.cpp, он нашел исходный код, и все в порядке.
Ответ 5
У меня была такая же проблема, но моя была потому, что я использую проект Eclipse CDT и Autotools. Поэтому мне пришлось вручную добавить новые .h
и .cpp
файлы в соответствующий Makefile.am
, а затем выполнить проект проектa > перенастроить проект, перестроить, то есть он.