gpt4 book ai didi

c++ - 未定义引用

转载 作者:行者123 更新时间:2023-11-27 23:34:38 24 4
gpt4 key购买 nike

我收到此链接器错误。我知道解决它的方法,但它困扰着我,因为该项目的另一部分链接良好,并且设计几乎相同。

首先,我有命名空间LCD。然后我有两个单独的文件,LCDText.h 和 LCDGraphic.h。

液晶文本.h:

//[snip]
void TextDraw(Widget *w);

void TextBarDraw(Widget *w);

void TextHistogramDraw(Widget *w);

void TextIconDraw(Widget *w);

void TextBignumsDraw(Widget *w);

void TextGifDraw(Widget *w);

}; // End namespace

液晶图形.h:

//[snip]
void GraphicDraw(Widget *w);

void GraphicIconDraw(Widget *w);

void GraphicBarDraw(Widget *w);

void GraphicHistogramDraw(Widget *w);

void GraphicBignumsDraw(Widget *w);

void GraphicGifDraw(Widget *w);

}; // End namespace

在 WidgetBignums.h 中我有:

//[snip]
using namespace LCD;

extern void TextBignumsDraw(Widget *w);
extern void GraphicBignumsDraw(Widget *w);

template <class T>
WidgetBignums<T>::WidgetBignums(Generic<T> *v, std::string n, Json::Value *section,
int row, int col) : Widget(n, section, row, col,
WIDGET_TYPE_BIGNUMS | WIDGET_TYPE_RC | WIDGET_TYPE_SPECIAL) {

if( v->GetType() == LCD_TEXT )
Draw = TextBignumsDraw; // Line 66
else if( v->GetType() == LCD_GRAPHIC )
Draw = GraphicBignumsDraw;
else
Draw = NULL;
//[snip]

我收到以下链接器错误:

LCDControl.o: In function `WidgetBignums':
/home/starlon/Projects/LCDControl/WidgetBignums.h:66: undefined reference to `LCD::TextBignumsDraw(LCD::Widget*)'

现在有一种方法可以修复它,但我不喜欢它。我可以将 LCD::TextBignumsDraw 移到 LCD 命名空间之外并且它可以工作。奇怪的是,链接器看到了 LCD::GraphicBignumsDraw。有什么线索吗?

编辑:我在 Fedora 11 上使用 gcc 4.4.1-2。使用 SCons 进行编译。

编辑:这是 WidgetBignums,显示 Draw

template <class T>
class WidgetBignums : public Widget {
Generic<T> *visitor_;
std::vector<char> FB_;
std::vector<char> ch_;
int min_;
int max_;
int update_;
int layer_;
Property *expression_;
Property *expr_min_;
Property *expr_max_;

QTimer *timer_;

void (*Draw)(Widget *);

public:
WidgetBignums(Generic<T> *visitor, std::string name, Json::Value *section, int row, int col);
~WidgetBignums();
void TextScroll() {};
void SetupChars();
void Update();
void Start();
void Stop();
std::vector<char> GetFB() { return FB_; }
std::vector<char> GetCh() { return ch_; }
Generic<T> *GetVisitor() { return visitor_; }
};

编辑:这是 TextBignumsDraw 的签名。

//[snip]
void TextBignumsDraw(Widget *w) {
//[snip]

编辑:顺便说一句,我在 TextHistogramDrawTextGifDraw 上也遇到了同样的错误。 TextIconDraw 和其他的没问题。

最佳答案

LCD::TextBignumsDraw() 的定义在哪里?这就是链接器似乎在提示的。不是声明,而是函数的实际定义。

当您将声明移出命名空间 LCD 时,事情开始起作用的事实表明 TextBignumsDraw() 的定义在全局命名空间中,而不是 LCD 命名空间。

这个(在一些 .cpp 文件中):

void TextBignumsDraw(Widget *w) {
// ...
}

需要包裹在

namespace LCD {

}

阻止。

关于c++ - 未定义引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1727350/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com