Я не совсем уверен, где моя проблема.Ошибка компоновщика QT Creator: Link2019 Файл не найден
Я использую Qt Creator для проекта OpenGL, и в первый раз я попытался добавить еще несколько классов в свой проект. Я добавил файлы заголовка и реализации: terrain.h, terrain.cpp, imageloader.h и imageloader.cpp.
Я думаю, что моя проблема заключается в моем файле .pro:
HEADERS += glwidget.h \
imageloader.h \
terrain.h
SOURCES += glwidget.cpp main.cpp \
imageloader.cpp \
terrain.cpp
QT += opengl
CONFIG -= app_bundle
CONFIG += console c++11
INCLUDEPATH += "../include"
INCLUDEPATH += $$PWD
RESOURCES += shaders.qrc
Когда я бегу QMAKE, нет никаких ошибок.
Затем, когда я строю проект (после очистки, бег QMAKE), я получаю следующее сообщение об ошибке:
glwidget.obj:-1: error: LNK2019: unresolved external symbol "private: static class Terrain * __cdecl GLWidget::loadTerrain(char const *,float)" ([email protected]@@[email protected]@[email protected]) referenced in function "protected: virtual void __cdecl GLWidget::initializeGL(void)" ([email protected]@@MEAAXXZ)
Qt Creator также говорит: Файл не найден glwidget.obj
Однако, проблема действительно связана с классом ландшафта или с тем, как он взаимодействует с glwidget.
Когда я удаляю все ссылки на местности, сборка отлично работает.
Однако, когда я добавить следующую строку в glwidget.cpp в методе initializeGL(), появляется ошибка LINK2019:
terrain = loadTerrain("test.bmp", 20);
местности определяется в glwidget.h как экземпляр класса Terrain от местности .cpp:
Terrain* terrain;
И loadTerrain определяется в glwidget.h как:
static Terrain* loadTerrain(const char* filename, float height);
Интересно, что эта ошибка возникает даже тогда, когда выполняется реализация loadTeerain.
Вот еще несколько вещей, которые я пробовал:
Когда я запускаю чист перед или после QMAKE или удалить файлы .obj в папке сборки, нет никаких изменений. Я заметил, что glwidget.obj, а также terrain.obj появляются, когда проект перестраивается.
Любая помощь приветствуется. Дайте мне знать, хотите ли вы увидеть какие-либо из моих файлов.
EDIT: Проблема сохраняется даже после того, как метод loadTerrain() нестатический.
EDIT 2 я, казалось, забыли вторую ошибку, что он бросает, хотя я не уверен, что это будет больше помощь:
debug\program2.exe:-1: error: LNK1120: 1 unresolved externals
отладки является папка, в которой. obj появляются, а program2 - это название проекта.
FIXED! Оказывается, проблема в статичности метода была проблемой. У вас не может быть объявлен статический метод в файлах заголовков, которые будут использоваться несколькими источниками в том виде, в котором я работал.Я заменил:
static Terrain* loadTerrain(const char* filename, float height);
с
Terrain* GLWidget::loadTerrain(const char* filename, float height);
, а также изменить последующие вызовы метода.
Благодарим за помощь!
Кажется, вам не хватает реализации loadTerrain в файле cpp? – demonplus
У меня была реализация, прокомментированная, однако раскол ее, похоже, не помогает. –
Внедрение реализации означает, что у вас нет реализации. Не могли бы вы опубликовать связанные части вашего заголовка и исходных файлов? – demonplus