[gcc] Half-gecompilede objecten/fout gelinkt?

Pagina: 1
Acties:

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11-2025

Korben

() => {};

Topicstarter
Ik krijg momenteel een linkerfoutmelding als ik mijn project probeer te compilen:
code:
1
2
rect.o (.text + 0xblaat) unreferenced: CRect::TopLeft()
...

Rect.cpp wordt wel goed gecompiled (krijg zelfs geen warnings oid) en objdump (k gebruik DJGPP) geeft wel aan dat CRect::TopLeft() is gedefinieerd in het object. Het vreemde is dat dit alleen bij dat bestand gebeurt, de andere objecten worden correct gelinkt.

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


Verwijderd

Is CRect::TopLeft() misschien een out-of-line inline member-functie? Zo niet graag een codefragment...

[edit]
Ik heb het wat preciezer uitgezocht, had laatst een soortgelijke error. Wat ik fout had gedaan was het volgende: een class gedefinieerd, laten we hem nu voor het gemak Rect noemen. In een bestand rect.h:
code:
1
2
3
4
5
6
7
8
9
class CRect {
public:
  // geblaat
  int TopLeft();
  // nog meer geblaat
private:
  tleft; // top left coordinate
  // ...
}

in een bestand rect.c:
code:
1
2
3
4
...
inline int CRect::TopLeft() {
  return tleft;
}

Het lijkt logisch dat TopLeft inline is gemaakt voor de snelheid, maar bovenstaande constructie is fout omdat een inline functie eigenlijk helemaal geen functie is: in plaats daarvan insert de compiler de code voor snellere prestatie, maar er bestaat dus geen adres/referentie naar een functie TopLeft() ofzo in het object rect.o omdat deze functie domweg niet bestaat, terwijl andere stukken programma hier niets van weten als ze alleen de header rect.h zien.

Conclusie: een inline functie is heel nuttig, maar moet in hetzelfde bestand worden gedefinieerd als waarin hij wordt gedeclareerd, omdat het eigenlijk geen functiedefinitie is, maar de opdracht aan de COMPILER om een stukje code in te voegen...

Wat een lang verhaal, mogelijk heeft het niets met jouw probleem te maken, maar het lijkt me ook nuttig voor anderen.

  • Korben
  • Registratie: Januari 2001
  • Laatst online: 14-11-2025

Korben

() => {};

Topicstarter
*sgop*

Ik heb het probleem opgelost. Ik zal uit educatief oogpunt de oplossing met jullie delen. Het probleem had misschien al kunnen worden opgelost als ik meer gedetailleerde informatie had gepost, maar goed...

Het probleem zat het hem in het gebruik van inline. Ik had in de headers bij bepaalde functies inline staan, maar in de source niet, en aangezien de compiler pas bij het compilen van de source gaat kijken naar inline stuff, ging de linker zoeken naar inline gecompilede functies, maar die waren er niet omdat dat niet zo in de source stond. Vervolgens was het zo dat ik inline functies probeerde te maken in een klasse, wat ook niet mag. Nou heb ik helemaal geen inline gedefinieerd, en nou compilet ie :P

.oisyn: Échte programmeurs haten PHP met een passie. Ben jij soms geen echte programmeur?


Verwijderd

*sgop*
Waarom? Je hebt toch een reactie gekregen?
Ik heb het probleem opgelost. Ik zal uit educatief oogpunt de oplossing met jullie delen. Het probleem had misschien al kunnen worden opgelost als ik meer gedetailleerde informatie had gepost, maar goed...

Het probleem zat het hem in het gebruik van inline.
Ja, zelfs zonder die informatie was de oplossing die ik had aangedragen dus in de goede richting...
Ik had in de headers bij bepaalde functies inline staan, maar in de source niet, en aangezien de compiler pas bij het compilen van de source gaat kijken naar inline stuff, ging de linker zoeken naar inline gecompilede functies, maar die waren er niet omdat dat niet zo in de source stond. Vervolgens was het zo dat ik inline functies probeerde te maken in een klasse, wat ook niet mag. Nou heb ik helemaal geen inline gedefinieerd, en nou compilet ie :P
:? Heb je mijn reactie wel gelezen? Ik denk eerder dat dat het probleem was.
...Vervolgens was het zo dat ik inline functies probeerde te maken in een klasse, wat ook niet mag...
Dit is totale onzin. In een klasse zijn functies zelfs standaard inline als je ze direct bij hun declaratie definieert en je kunt ze ook gewoon inline maken met het keyword inline bij de declaratie.

Tip: lees eens het hoofdstuk over inline functies uit het gratis elektronische boek van Bruce Eckel over C++:
http://www.mindview.net/Books/TICPP/ThinkingInCPP2e.html