このリンカ エラーが発生します。私はそれを回避する方法を知っていますが、プロジェクトの別の部分がうまくリンクしていて、ほとんど同じように設計されているため、私を悩ませています。
まず、名前空間がありますLCD
。それから、LCDText.h と LCDGraphic.h という 2 つの別個のファイルがあります。
LCDText.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
LCDGraphic.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*)'
これを修正する1つの方法がありますが、私はそれが好きではありません. 名前空間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]
編集:ちなみに、私はTextHistogramDraw
andでも同じエラーが発生しTextGifDraw
ています。TextIconDraw
そして他は大丈夫です。