Je reçois cette erreur de l'éditeur de liens. Je connais un moyen de contourner le problème, mais cela m'embête parce qu'une autre partie du projet est très bien reliée et conçue de façon presque identique.Référence non définie
D'abord, j'ai l'espace de noms LCD
. Ensuite, j'ai deux fichiers distincts, LCDText.h et LCDGraphic.h.
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
Et WidgetBignums.h je:
//[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]
Et je reçois l'erreur de liens suivant:
LCDControl.o: In function `WidgetBignums':
/home/starlon/Projects/LCDControl/WidgetBignums.h:66: undefined reference to `LCD::TextBignumsDraw(LCD::Widget*)'
Maintenant, voici une façon de le réparer, mais je ne l'aime pas. Je peux déplacer LCD::TextBignumsDraw
en dehors de l'espace de noms LCD
et cela fonctionne. Assez étrange, l'éditeur de liens voit LCD::GraphicBignumsDraw
. Des indices? Edit: J'utilise gcc 4.4.1-2 sur Fedora 11. Utilisation de SCons pour compiler. Editer: Voici WidgetBignums, montrant 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_; }
};
Édition: Voici la signature de TextBignumsDraw
.
//[snip]
void TextBignumsDraw(Widget *w) {
//[snip]
Edit: Soit dit en passant, je reçois la même erreur pour TextHistogramDraw
et TextGifDraw
ainsi. TextIconDraw
et les autres sont bien.
Comment liez-vous dans la bibliothèque? Quel compilateur/éditeur de liens utilisez-vous? – LeopardSkinPillBoxHat
pouvez-vous poster le fichier de code qui comprend "WidgetBignums.h" .. peut-être WidgetBignums.cpp? –
@Andrew: J'ai inclus la classe elle-même. Dites-moi si vous avez besoin d'autre chose. – Scott