【发布时间】:2016-04-27 05:39:15
【问题描述】:
我不太确定我的问题出在哪里。
我正在将 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)" (?loadTerrain@GLWidget@@CAPEAVTerrain@@PEBDM@Z) referenced in function "protected: virtual void __cdecl GLWidget::initializeGL(void)" (?initializeGL@GLWidget@@MEAAXXZ)
Qt Creator 还说:File Not Found glwidget.obj
然而,问题似乎出在地形类,或者它如何与 glwidget 交互。
当我删除所有对地形的引用时,构建工作正常。
但是,当我在 initializeGL() 方法中将以下行添加到 glwidget.cpp 时,会出现 LINK2019 错误:
terrain = loadTerrain("test.bmp", 20);
terrain 在 glwidget.h 中定义为 terrain.cpp 中的 Terrain 类的一个实例:
Terrain* terrain;
而loadTerrain在glwidget.h中定义为:
static Terrain* loadTerrain(const char* filename, float height);
有趣的是,即使注释掉了 loadTeerin 的实现,也会出现这个错误。
以下是我尝试过的其他一些方法:
当我在 qmake 之前或之后运行 clean,或者删除 build 文件夹中的 .obj 文件时,没有任何变化。我注意到在重建项目时确实会出现 glwidget.obj 和 terrain.obj。
感谢任何帮助。如果您想查看我的任何文件,请告诉我。
编辑:即使将 loadTerrain() 方法设为非静态,问题仍然存在。
EDIT 2我似乎也忘记了它抛出的第二个错误,但我不确定这是否会有所帮助:
debug\program2.exe:-1: error: LNK1120: 1 unresolved externals
debug 是 .obj 出现的文件夹,program2 是项目的名称。
已修复! 事实证明,将方法设为静态是问题所在。您不能像我那样在头文件中声明将由多个源使用的静态方法。我换了:
static Terrain* loadTerrain(const char* filename, float height);
与
Terrain* GLWidget::loadTerrain(const char* filename, float height);
以及更改对该方法的后续调用。
感谢您的帮助!
【问题讨论】:
-
您似乎错过了 cpp 文件中 loadTerrain 的实现?
-
我确实注释掉了一个实现,但是取消注释似乎没有帮助。
-
注释掉实现意味着你没有实现。您能否发布更新的头文件和源文件的相关部分?
-
你现在收到同样的错误吗?
-
我正要回复请求的代码行,但这让我意识到了问题所在。当我将方法设为非静态并取消注释实现时,我将其作为对 loadTerrain 的调用和声明,而不是 GLWidget::loadTerrain。现在看来问题已经解决了!谢谢你的帮助!我在这个问题上花了很长时间。
标签: c++ qt linker qt-creator header-files