Portál AbcLinuxu, 10. května 2025 04:54
#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 statuspř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.
# 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
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.
libm
se nelinkuje automaticky, zatímco libc
ano.
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...
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.
sqrt(20)
a použije výsledek, takže v programu není vůbec potřeba funkci sqrt()
volat.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.