Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[C/C++] Waarom linken?

Pagina: 1
Acties:

  • COMPUTERFREAKED
  • Registratie: November 2003
  • Niet online
Op het moment ben ik wat prutsen in linux met C/C++. Ik volg een tutorial en daarin wordt onder andere gewerkt met de sqrt functie.

Er wordt duidelijk aangegeven dat ik gcc de flags -lm (libm linken) mee moet geven. Dat doe ik ook netjes en dit werkt. (dit staat overigens ook in de man pages)

To zo ver dus as advertised. Eigenwijs als ik was probeerde ik het natuurlijk ook zonder libm te linken. Maar dit werkt ook! Ldd geeft bij de versie zonder linken idd aan dat libm niet gelinkt is en bij de andere versie wel. De programmatjes zijn ook exact even groot dus meer verschil is er mijns inziens niet.

Mijn vraag is dus eigenlijk: waarom zou ik hem linken?

  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

Linken is inherent aan C/C++.

Elke C of C++ file (translation unit) word gecompiled naar een object file (meestal .obj). De meeste programma's worden opgebouwd uit meerdere C/C++ files, dus meerdere gecompilede object files. De taak van de linker is om een verzameling object files te combineren tot 1 binary.

In jouw programma heb je waarschijnlijk een header file geinclude waar in stond dat er een functie sqrt bestaat. Echter, in jouw translation unit staat geen implementatie van sqrt, dus gaat de linker in alle libraries die je opgegeven hebt zoeken naar die functie.

In principe zou jouw geval een linker error moeten geven omdat sqrt niet gevonden is (immers, je had libm nodig). Hoe dat komt durf ik niet te zeggen*

* (Geavanceerd: omdat je programma's identiek zijn, denk ik dat sqrt een compiler intrinsic is en word automagisch geinlined. Ik gebruik nooit GCC, dus ik durf dat niet met zekerheid te zeggen. Daarom heb je voor die specifieke functie geen libm nodig)

[ Voor 9% gewijzigd door MLM op 26-10-2008 13:39 ]

-niks-


  • COMPUTERFREAKED
  • Registratie: November 2003
  • Niet online
MLM schreef op zondag 26 oktober 2008 @ 13:37:
In principe zou jouw geval een linker error moeten geven omdat sqrt niet gevonden is (immers, je had libm nodig). Hoe dat komt durf ik niet te zeggen*
Dat dacht ik ook...
MLM schreef op zondag 26 oktober 2008 @ 13:37:
* (Geavanceerd: omdat je programma's identiek zijn, denk ik dat sqrt een compiler intrinsic is en word automagisch geinlined. Ik gebruik nooit GCC, dus ik durf dat niet met zekerheid te zeggen. Daarom heb je voor die specifieke functie geen libm nodig)
Met LDD kan ik zien dat libm idd niet geinclude is, miss dat dat idd het geval is, ik zal eens even zoeken..

[ Voor 27% gewijzigd door COMPUTERFREAKED op 26-10-2008 13:49 ]


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Weet je zeker dat hij een nieuwe executable maakt? Is het niet gewoon die oude met -lm? :)

  • COMPUTERFREAKED
  • Registratie: November 2003
  • Niet online
Zoijar schreef op zondag 26 oktober 2008 @ 13:59:
Weet je zeker dat hij een nieuwe executable maakt? Is het niet gewoon die oude met -lm? :)
Heh neeh dat check ik dus met LDD ;)


Anyway ik ben er achter. Na wat zoeken blijkt er een compile optie -fno-builtin te zijn wat zoveel doet als:

Don't use GCCs inline code for small common functions. Call them instead. GCC's inline functions include printf, strcpy, strncpy, and sqrt.

Bedankt voor de hulp!