🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: be.comp.programming
8 messages
8 total messages Started by Gunter Schelfhout Tue, 10 Sep 2002 13:50
math.h
#7410
Author: Gunter Schelfhout
Date: Tue, 10 Sep 2002 13:50
12 lines
1764 bytes
Ik ben begonnen met C te leren.
In ��n van de opgaven van een handboek, moet ik gebruik maken van de 'pow' 
en de 'sqrt' welke zich in <math.h> moeten bevinden.
Ook al include ik die headers in de bronfile, ik blijf 'undefined reference 
to'-errors krijgen.(?)

Ook als ik eens grep door de headerfile <math.h> in /usr/include, vind ik 
niets van pow in deze file. Nochtans volgens de man-page moet pow terug te 
vinden zijn in deze headerfile.
Zie ik iets over het hoofd?
-- 
Blood, sweat & tears
Re: math.h
#7411
Author: Dominique Devriese
Date: Tue, 10 Sep 2002 13:56
18 lines
1764 bytes
Gunter Schelfhout writes:

> Ik ben begonnen met C te leren.  In ~~n van de opgaven van een
> handboek, moet ik gebruik maken van de 'pow' en de 'sqrt' welke zich
> in <math.h> moeten bevinden.  Ook al include ik die headers in de
> bronfile, ik blijf 'undefined reference to'-errors krijgen.(?)

> Ook als ik eens grep door de headerfile <math.h> in /usr/include,
> vind ik niets van pow in deze file. Nochtans volgens de man-page
> moet pow terug te vinden zijn in deze headerfile.  Zie ik iets over
> het hoofd?  -- Blood, sweat & tears

je moet linken met "-lm" als optie...
sjuus
domi

-- 
 Calculon: I just pray they like me half as much as I do.
Re: math.h
#7412
Author: Gunter Schelfhout
Date: Tue, 10 Sep 2002 14:08
20 lines
1619 bytes
Dominique Devriese wrote:

[knip]

> 
> je moet linken met "-lm" als optie...
> sjuus
> domi
> 

Thnx Domi, dat werkt.

Maar als ge mij ne keer kunt uitleggen waarom de functies uit <stdio.h> daar 
geen probleem van maken zonder '-lm'?
BTW. Ik gebruik Anjuta om te programmeren, omdat ik de ingebouwde editor zo 
goed vindt (ik gebruik deze dus niet als echte IDE). Hij roept gcc aan met 
'Wall' en '-g' (en -o uiteraard). Maar geen '-lm'. Ik zal ne keer in de 
instellingen van Anjuta kijken.
-- 
Blood, sweat & tears
Re: math.h
#7413
Author: Dominique Devriese
Date: Tue, 10 Sep 2002 14:42
92 lines
4201 bytes
Gunter Schelfhout writes:

> Dominique Devriese wrote: [knip]
>>
>> je moet linken met "-lm" als optie...  sjuus domi

> Thnx Domi, dat werkt.
> Maar als ge mij ne keer kunt uitleggen waarom de functies uit
> <stdio.h> daar geen probleem van maken zonder '-lm'? 

oops, ja, dat was ik nog van plan.
Er is namelijk een verschil tussen compileren en linken.  Je hebt
misschien gemerkt dat al je files onafhankelijk van elkaar
gecompileerd worden, en daarna pas bij elkaar gelinkt.

Bekijk het volgende voorbeeld:

"
domi: ~/src/test> cat test.c
void a( int b, const char* c );

int main()
{
    a( 4, "appels" );
    return 0;
}
domi: ~/src/test> gcc -pedantic -Wall -c test.c -o test.o
domi: ~/src/test> gcc test.o -o test
test.o: In function `main':
test.o(.text+0x11): undefined reference to `a'
collect2: ld returned 1 exit status
domi: ~/src/test> 
"

Bij het compileren ( als je gcc aanroept met de -c optie ), geeft hij
geen fout, ook al is functie a niet gedefini�erd.  Ze is immers wel
gedeclareerd, zodat de compiler wel weet dat ze bestaat.   Bij het
linken echter, moeten alle functies die je gebruikt ook gedefini�erd
zijn, anders krijg je "undefined reference" fouten.  als je doet:
domi: ~/src/test> cat > a.c << EOF
> void a( int b, const char* c )
> {
>   /*  doe vanalles...  */
> };
> EOF
domi: ~/src/test> gcc -c a.c -o a.o
domi: ~/src/test> gcc a.o test.o -o test
domi: ~/src/test> 

zijn de fouten weg.  A is nu gedefini�erd.  Het verschil met jouw
situatie is dat
1 de functie a gedefini�erd wordt in de gedeelde bibliotheek libm.so,
en je dus moet linken met -lm, in plaats van a.o mee te linken.
2 de functie a gedeclareerd wordt in de header "math.h", die er heel
kort zo zou kunnen uitzien:
"
void a( int, const char* )
"
Deze hoort niet bij jouw programma, maar bij de library libm.so, en je
gebruikt die header om zeker te zijn dat je de functie niet anders
declareert dan ze gedefini�erd is.  Anders zou je ze evengoed zelf
kunnen declareren, zonder enig verschil in betekenis.

Ah ja, nog dit.  die libm.so ( de standaard C math library ) wordt dus
niet gelinkt op hetzelfde tijdstip als dat die a.o zou gelinkt
worden.  Aangezien libm.so een gedeelde library is wordt die telkens
opnieuw gelinkt bij het opstarten, om plaats, geheugen, en onderhoud
te besparen.  Bij het normale linken kijkt hij enkel na of alle
functies die je gebruikt gedefini�erd zijn, maar hij linkt ze nog
niet. 

Voil�, ik hoop dat dat ongeveer duidelijk is.

> BTW. Ik
> gebruik Anjuta om te programmeren, omdat ik de ingebouwde editor zo
> goed vindt (ik gebruik deze dus niet als echte IDE).

allez, kom, tis u vergeven.. :)
Nu nog overstappen op emacs.. ;)

> Hij roept gcc
> aan met 'Wall' en '-g' (en -o uiteraard). Maar geen '-lm'. Ik zal ne
> keer in de instellingen van Anjuta kijken.  

goed idee..

sjuus
domi

-- 
Q:	What do Winnie the Pooh and John the Baptist have in common?
A:	The same middle name.
Re: math.h
#7414
Author: Gunter Schelfhout
Date: Tue, 10 Sep 2002 14:57
36 lines
1924 bytes
Dominique Devriese wrote:

>>>
>>> je moet linken met "-lm" als optie...  sjuus domi
> 
>> Thnx Domi, dat werkt.
>> Maar als ge mij ne keer kunt uitleggen waarom de functies uit
>> <stdio.h> daar geen probleem van maken zonder '-lm'?
> 
[knip goede uitleg]

> Voil�, ik hoop dat dat ongeveer duidelijk is.

j����!

>> BTW. Ik
>> gebruik Anjuta om te programmeren, omdat ik de ingebouwde editor zo
>> goed vindt (ik gebruik deze dus niet als echte IDE).
> 
> allez, kom, tis u vergeven.. :)
> Nu nog overstappen op emacs.. ;)

Wie weet?

>> Hij roept gcc
>> aan met 'Wall' en '-g' (en -o uiteraard). Maar geen '-lm'. Ik zal ne
>> keer in de instellingen van Anjuta kijken.
> 
> goed idee..

Ik heb bij de instellingen lm bijgevoegd en ok nu.

Tnx

-- 
Blood, sweat & tears
Re: math.h
#7415
Author: Slayerke
Date: Tue, 10 Sep 2002 15:03
37 lines
2761 bytes
Gunter Schelfhout wrote:

> Dominique Devriese wrote:
> 
> [knip]
> 
>> 
>> je moet linken met "-lm" als optie...
>> sjuus
>> domi
>> 
> 
> Thnx Domi, dat werkt.
> 
> Maar als ge mij ne keer kunt uitleggen waarom de functies uit <stdio.h>
> daar geen probleem van maken zonder '-lm'?
> BTW. Ik gebruik Anjuta om te programmeren, omdat ik de ingebouwde editor
> zo goed vindt (ik gebruik deze dus niet als echte IDE). Hij roept gcc aan
> met 'Wall' en '-g' (en -o uiteraard). Maar geen '-lm'. Ik zal ne keer in
> de instellingen van Anjuta kijken.
De functies uit <stdio.h> worden standaard gelinkt(libc) terwijl die van de 
math-library niet standaard worden gelinkt. 
Beide worden normaal wel dynamisch gelinkt, omdat die shared libs zijn, die 
ook door andere applicaties gebruikt worden en zich dus al in het geheugen 
kunnen bevinden, maar op zich maakt dat bij het maken van je programma niet 
zoveel uit, moest je ze static linken zou je uitvoerbaar programma gewoon 
wat groter worden.
Je kan je dan natuurlijk afvragen waarom niet gewoon alle libs worden 
gelinkt, maar moest dat zo zijn, dan zou dat leiden tot een enorme 
hoeveelheid name-clashes(functies met dezelfde naam en parameters met 
verschillende implementatie (of zelfs dezelfde) in 2 verschillende libs).
De -g optie bij gcc is handig bij het debuggen, in bvb gdb, dan kun je 
breakpoints zetten op bepaalde lijnen in je sourcecode en het foutgaande 
stuk code bekijken, variabelen hun waarde uitlezen,...
-- 
Groeten,
Slayerke
Re: math.h
#7416
Author: Gunter Schelfhout
Date: Tue, 10 Sep 2002 16:11
24 lines
2287 bytes
Slayerke wrote:

[knip]

>> 
>> Maar als ge mij ne keer kunt uitleggen waarom de functies uit <stdio.h>
>> daar geen probleem van maken zonder '-lm'?
>> BTW. Ik gebruik Anjuta om te programmeren, omdat ik de ingebouwde editor
>> zo goed vindt (ik gebruik deze dus niet als echte IDE). Hij roept gcc aan
>> met 'Wall' en '-g' (en -o uiteraard). Maar geen '-lm'. Ik zal ne keer in
>> de instellingen van Anjuta kijken.
> De functies uit <stdio.h> worden standaard gelinkt(libc) terwijl die van
> de math-library niet standaard worden gelinkt.

Vand��r. 'k Snap het. ;-)

Ik had wat verder moeten kijken, want in dit boek "ANSI C: Problem solving 
and programming" (echt een aanrader) staat in Appendix G een hele uitleg 
over het compileren onder Unix. 
Ze hadden het misschien beter als ��n van de eerste hoofdstukken geplaatst.

Thnx in ieder geval.
-- 
Blood, sweat & tears
Re: math.h
#7417
Author: Bart.Vanhauwaert
Date: Tue, 10 Sep 2002 18:01
11 lines
1258 bytes
Gunter Schelfhout <nospam@please.com> wrote:
> Maar als ge mij ne keer kunt uitleggen waarom de functies uit <stdio.h> daar 
> geen probleem van maken zonder '-lm'?

Omdat de functies uit <stdio.h> niet in de library 'm' zitten, maar in de
library 'c'. En gcc linkt de 'c' lib standaard mee en de 'm' niet.

cu bart

-- 
http://www.irule.be/bvh/
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads