math.h hiányzó fuggvényei

 ( Anonymous | 2003. május 22., csütörtök - 14:01 )

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Most kezdek C programozással foglalkozni, és van egy problémám: az újabb disztribúciók alatt nem tudom használni a math.h függvényeit (eddig SuSe 7.3, Mandrake 8 és RedHat 8 alatt próbáltam). Mivel nem otthonról netezek, a pontos hibaüzenetet nem tudom leírni, arról van szó, hogy nem léteznek ezek a függvények Linux alatt a gcc fordítóval (-ansi kapcsolóval) a lényeg az, hogy például egy egyszerű sin(x) hívás is nem létező függvény hibát ad. Ezek a programok DOS és Windows alatt is tökéletesen futnak egy régi Borland C++ 3.1-el.
Ha valaki a kissé ködös leírásom ellenére is rájön, hogy mi a hiba, kérem, segítsen!

Imho próbáld meg a gcc paramétereként megadni a -lm opciót is.

Hali!

[b:2ab334415b]gyu[/b:2ab334415b]-nak valószínűleg igaza van... Amúgy a gcc '-ansi' kapcsolója nem nagy befolyással van a függvényekre :P Mint tudod, a C nyelv önmagában egy irinyó-pirinyó kis nyelvecske, néhány ciklusszervező és összehasonlító utasítással. (while, do, until, return, if, switch, case, ...). Minden többi az úgynevezett könyvtárakból (library) jön. Amior egy forrásfile-ba include-olsz valami headert (pl. stdlib.h, stdio.h, math.h), akkor még csak a dolog egyik részét végezted el, azaz a programod számára is 'láthatóvá' tetted azokat az új függvényeket amik az adott könyvtár(ak)ban megtalálhatóak (már aminek a definicióit az include-olt header tartalmazza).
A fordításnak így sikerülnie kell (ha nem sikerül, akkor lehetséges az a hiba, hogy elfelejtkeztél egy includ-ról). [source] -> [object] A következő lépés a futtatható program előállítása (a link-elés), amihez nem a definíciókra, hanem azokra a könyvtárakra (és a többi object file-ra) van szüksége a linker-nek, amikben megtalálhatók azok a rutinok (függvények), amikre a programod hivatkozik. Ezt külön meg kell adni, ha nem az stdlib az (ezt a linker mindig megnézi). [object] -> [executable]

Ha külön nem szólsz a 'gcc' mind a két lépést megpróbálja, de külön külön is lehet a dolgokat szedni.

Zsiráf

P.s.: A forrásba az 'include'-ok a fordításhoz szükséges definíciókat adják, míg a futtatható program előállításához a '-l[b:2ab334415b]xxxx[/b:2ab334415b]' -el kell megadni a linker-nek, hogy milyen könyvtárakban keressen még függvényeket a stdlib-en kívül...

Véletlenül nem 2.96-os fordítóval próbáltad? Ha jól sejtem fabs működik. Ebbe én is belefutottam, nem tudom, hogy mi a megoldás rá. Debianban 2.95-tel, 3.x jól működött.
BG

Sziasztok!

Pontosan ebbe a problémába ütköztem bele! Már totál felhúztam magam, hogy mi lehet a baja és csak egy -lm kellett neki :D

Már épp nyitni akartam egy új topikot, mikor megláttam ezt. Tipikus példája, hogy végig kell olvasni a fórumot, vagy használni kell a keresőt. Szinte mindíg bejön.

Köszi!

Sziasztok!

Ebbe futottam most bele en is, es eloszor orultem, hogy talaltam ra topikot, de aztan kiderult, vagy en vagyok nagy marha vagy az en gcc forditommal van baj. Nalam ugyanis a '-lm' kapcsoloval sem mukodik. Egyszeru kis teszt-progit irtam, ami egy szam szinuszat, koszinuszat adna vissza, de nem akar mukodni.. Itt van a konzol altal adott hibauzenet:

safranek@96lab:~/c_progs$ gcc -o matek1 -lm matek1.c
/tmp/ccUSQA5u.o: In function `main':
matek1.c:(.text+0x3b): undefined reference to `sin'
matek1.c:(.text+0x5a): undefined reference to `cos'
collect2: error: ld returned 1 exit status

Na, most akkor mit b..tam el? :)

Arpi / kando
(vasgyu"jto")

Szerintem előbbi.
Tedd a végére a -lm kapcsolót.

Csoda tortent :)
Meg jo, hogy a Linux programozas c. konyben is rosszul van irva a parancsosr...
:)

Koszonom!

Arpi / kando
(vasgyu"jto")

A vilag valtozik es vele egyutt valtoznak a linker konfiguraciok is. A fenti fenomen egyebkent a '--as-needed' linker flag bevezetesenek koszonheto, errol infot talalni nem nehez, ha erdekel majd utananezel, de kezdokent nem biztos, hogy bele kell bonyolodnod a temaba. Szemlelteteskent annyi azert alljon itt, hogy a fenti flag hasznalataval megvaltoztathato a kimenet:

Hiba: gcc -Wl,--as-needed -o matek1 -lm matek1.c

OK: gcc -Wl,--no-as-needed -o matek1 -lm matek1.c

De a megoldast a helyes sorrend hasznalata jelenti, ahogy azt mar irtak.

Elsőre logikátlannak tűnhet, de előbb kell az a dolog ami használja, és utána az amit.

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee." -- Ted Ts'o