Portál AbcLinuxu, 10. května 2025 04:54

Dotaz: gcc a podivnost s math.h

2.8.2007 18:25 Jiří J. | skóre: 34 | blog: Poutník | Brno
gcc a podivnost s math.h
Přečteno: 890×
Odpovědět | Admin
Zdravím,
pokouším se použít funkci sqrt z hlavičkového souboru math.h v C programu, ale nějak mi nefunguje, pokud sqrt dostane jako parametr proměnnou..
Příkladový program jsem dost ostříhal, ale měl by fungovat:
#include <math.h>

int main ()
{
  float x = 20;
  float y = sqrt(x);
}
při kompilaci vyhodí error
/tmp/ccSMkv5b.o: In function `main':
testing.c:(.text+0x40): undefined reference to `sqrt'
collect2: ld returned 1 exit status
přestože math.h je includovaný, co více, následující ukázka funguje..
#include <stdio.h>
#include <math.h>

int main ()
{
  float y = sqrt(20);
  printf("%f\n", y);
}
- vrátí 4.472136..

Někde jsem četl, že místo floatů tam má být double, zkusil jsem, ale se stejným výsledkem.
Může to být chyba v math.h? Kernel headers mám k aktuálnímu kernelu..
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

2.8.2007 18:29 Jiří J. | skóre: 34 | blog: Poutník | Brno
Rozbalit Rozbalit vše Re: gcc a podivnost s math.h
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pardon, zapomněl jsem dodat..
# gcc --version
gcc (GCC) 4.1.2
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

# md5sum /usr/include/math.h
ed13bac546997533b49b6f221ade841d  /usr/include/math.h

# uname -r
2.6.21.5

# cat /etc/slackware-version
Slackware 12.0.0
2.8.2007 18:34 a7dfa
Rozbalit Rozbalit vše Re: gcc a podivnost s math.h
Odpovědět | | Sbalit | Link | Blokovat | Admin
sqrt je funkce v knihovne libm, takze je treba linkovat s -lm.
2.8.2007 18:40 Jiří J. | skóre: 34 | blog: Poutník | Brno
Rozbalit Rozbalit vše Re: gcc a podivnost s math.h
Díky, pomohlo, přečtu si o tom více..
Jiří P. avatar 2.8.2007 18:36 Jiří P. | skóre: 24 | blog: programování
Rozbalit Rozbalit vše Re: gcc a podivnost s math.h
Odpovědět | | Sbalit | Link | Blokovat | Admin
To nejdůležitější jste neuvedl: jaké parametry zadáváte programu gcc kterým program překládáte? Vypadá to ale na chybu linkeru - zkuste se podívat na přepínač -L pro specifikaci knihovny, která se má přilinkovat.
In a world without fences and walls, who needs Gates and Windows?
2.8.2007 18:39 Jiří J. | skóre: 34 | blog: Poutník | Brno
Rozbalit Rozbalit vše Re: gcc a podivnost s math.h
Většinou nepředávám žádné speciální u těchto "jednoduchých" programů, pokud testuji, tak ani -o , jen jméno souboru..
andree avatar 2.8.2007 19:13 andree | skóre: 39 | blog: andreeeeelog
Rozbalit Rozbalit vše Re: gcc a podivnost s math.h
hadam ze ked clovek naincludeuje <stdio.h>, tak sa potrebne kniznice (-lm?) nalinkuju same... ak naincludeujes iba math.h, tak to asi prekladac neodhadne no...
2.8.2007 19:38 Jiří J. | skóre: 34 | blog: Poutník | Brno
Rozbalit Rozbalit vše Re: gcc a podivnost s math.h
Já includoval i <stdio.h>, ale problém byl stejný... gcc je v něčem až moc "inteligentní" a v něčem ne...
2.8.2007 20:06 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: gcc a podivnost s math.h
Přestaňte, prosím, planě spekulovat a zjistěte si, jak se věci skutečně mají (třeba z odpovědí na téměř identický dotaz, který se tu objevil nedávno). Pletete si hlavičkové soubory a knihovny. Celý "problém" je v tom, že knihovna libm se nelinkuje automaticky, zatímco libc ano.
2.8.2007 23:05 Jiří J. | skóre: 34 | blog: Poutník | Brno
Rozbalit Rozbalit vše Re: gcc a podivnost s math.h
Omlouvám se za to, že jsem nehledal asi dostatečně dobře (poučení) a neuvědomil jsem si, že některé funkce v math.h potřebují libm, nicméně hlavičkový soubor a knihovnu snad ještě rozeznám a poznámka o "inteligenci" gcc byla myšlena např. k případu, kdy jsem schválně překřížil 3 pole, výsledkem měl být segfault nebo vzájemné ovnivňování polí, ale gcc si všechny 3 v paměti pěkně za sebou seřadil (a není jediný).. možná to tak má být, ale podle nahlížení do starších tutoriálů tomu tak dříve nebylo...
3.8.2007 03:15 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: gcc a podivnost s math.h

Pokud je vám opravdu jasný rozdíl mezi hlavičkovým souborem a knihovnou, tak nechápu, proč píšete věci jako

při kompilaci vyhodí error … přestože math.h je includovaný

nebo

Já includoval i <stdio.h>, ale problém byl stejný...

Protože pak by vám mělo být jasné, že to, které standardní hlavičkové soubory includujete, nemůže mít na chybu linkeru nejmenší vliv.

3.8.2007 13:42 petris
Rozbalit Rozbalit vše Re: gcc a podivnost s math.h
Já bych řekl, že jste nehledal vůbec. Zkusil jsem si pro zajímavost man sqrt a co to nevidím - hned pod deklarací funkce je: "Link with -lm."
3.8.2007 03:22 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: gcc a podivnost s math.h
Odpovědět | | Sbalit | Link | Blokovat | Admin
Co se týká toho, že při linkování druhé otázky k chybě nedojde, to je způsobeno pravděpodobně tím, že v tomto případě překladač sám spočítá konstantu sqrt(20) a použije výsledek, takže v programu není vůbec potřeba funkci sqrt() volat.
3.8.2007 15:35 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: gcc a podivnost s math.h
…při linkování druhé ukázky…

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.