Thread View: be.comp.programming
8 messages
8 total messages
Started by Gunter Schelfhout
Tue, 10 Sep 2002 13:50
math.h
Author: Gunter Schelfhout
Date: Tue, 10 Sep 2002 13:50
Date: Tue, 10 Sep 2002 13:50
12 lines
1764 bytes
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
Author: Dominique Devriese
Date: Tue, 10 Sep 2002 13:56
Date: Tue, 10 Sep 2002 13:56
18 lines
1764 bytes
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
Author: Gunter Schelfhout
Date: Tue, 10 Sep 2002 14:08
Date: Tue, 10 Sep 2002 14:08
20 lines
1619 bytes
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
Author: Dominique Devriese
Date: Tue, 10 Sep 2002 14:42
Date: Tue, 10 Sep 2002 14:42
92 lines
4201 bytes
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
Author: Gunter Schelfhout
Date: Tue, 10 Sep 2002 14:57
Date: Tue, 10 Sep 2002 14:57
36 lines
1924 bytes
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
Author: Slayerke
Date: Tue, 10 Sep 2002 15:03
Date: Tue, 10 Sep 2002 15:03
37 lines
2761 bytes
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
Author: Gunter Schelfhout
Date: Tue, 10 Sep 2002 16:11
Date: Tue, 10 Sep 2002 16:11
24 lines
2287 bytes
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
Author: Bart.Vanhauwaert
Date: Tue, 10 Sep 2002 18:01
Date: Tue, 10 Sep 2002 18:01
11 lines
1258 bytes
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