【发布时间】:2014-04-06 17:41:05
【问题描述】:
我正在开发 C++ Qt 应用程序。我有一个抽象班和两个孩子。其中一个孩子完全按照应有的方式工作,但第二个却导致错误:
Freewer.obj:-1: 错误: LNK2001: 无法解析的外部符号“public: virtual void __thiscall Sierpinski::render(class QPainter &,class QRect)” (?render@Sierpinski@@UAEXAAVQPainter@@VQRect@@@ Z)
找不到文件:Freewer.obj
问题是,两个孩子的定义方式相同。
让我们向您展示我的代码。
分形.h:
#ifndef FRACTAL_H
#define FRACTAL_H
#include <QPainter>
#include <QRect>
#include <QDebug>
class Fractal
{
public:
virtual void render(QPainter &painter, QRect target) = 0;
};
#endif // FRACTAL_H
Cantor.h:
#ifndef CANTOR_H
#define CANTOR_H
#include "Fractal.h"
class Cantor : public Fractal
{
public:
void render(QPainter &painter, QRect target) Q_DECL_OVERRIDE;
};
#endif // CANTOR_H
Cantor.cpp:
#include "Cantor.h"
void Cantor::render(QPainter &painter, QRect target)
{
Q_UNUSED(painter);
Q_UNUSED(target);
qDebug() << "Rendering Cantor's Discontinuum...";
}
谢尔宾斯基.h:
#ifndef SIERPINSKI_H
#define SIERPINSKI_H
#include "Fractal.h"
class Sierpinski : public Fractal
{
public:
void render(QPainter &painter, QRect target) Q_DECL_OVERRIDE;
};
#endif // SIERPINSKI_H
谢尔宾斯基.cpp:
#include "Sierpinski.h"
void Sierpinski::render(QPainter &painter, QRect target)
{
Q_UNUSED(painter);
Q_UNUSED(target);
qDebug() << "Rendering Sierpinski triangle...";
}
现在,当我想创建 Cantor 类的实例时,它可以正常工作。但是当我想创建一个 Sierpinski 类的实例时,它会导致我上面写的错误。
当我以这种方式更改 Sierpinsky 头文件时:
谢尔宾斯基.h:
#ifndef SIERPINSKI_H
#define SIERPINSKI_H
#include "Fractal.h"
class Sierpinski : public Fractal
{
public:
void render(QPainter &painter, QRect target)
{
Q_UNUSED(painter);
Q_UNUSED(target);
qDebug() << "Rendering Sierpinski triangle...";
}
};
#endif // SIERPINSKI_H
我不会使用 Sierpinski.cpp,一切正常。是不是很奇怪?你能帮我吗?我哪里有什么错误?我想以与康托尔相同的方式使用谢尔宾斯基定义。
非常感谢。
编辑:
在 @Joachim Isaksson 的问题之后,我尝试以与 Cantor 和 Sierpinski 相同的方式添加另一个分形,但我遇到了与 Sierpinski 相同的错误。新课程称为 Koch,但它不起作用。但是当我离开 Koch.cpp 文件并直接在头文件中使用渲染函数的定义时,一切正常。
【问题讨论】:
-
看起来好像没有链接 Sierpinski.cpp/Sierpinski.o。您确定您没有打错名称并且链接器会发出警告吗?
-
是的,所有文件名和包含都是由 Qt Creator 生成的,我尝试了更多次。未发出警告。
-
你能把.pro文件的内容贴出来吗,看来Sierpinski.cpp没有添加到中的项目中来源?
-
或者它可能被添加了,但是从那以后您手动更改了文件结构。但是@Zlatomir 肯定是正确的,这是 .pro 文件的问题。还要确保在重建之前清理/运行 qmake,过时的 Makefile(由 qmake 生成)也可以这样做。
-
@LaszloPapp 它应该自动运行,但它不会自动运行是一个常见问题,因此 Matt Phillips 可能对文件是正确的,并且 run qmake 可以修复错误。
标签: c++ qt qt-creator qmake qtgui