C -be irt program nem fordul

 ( rigidus | 2005. január 16., vasárnap - 15:17 )

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ő.

Szervusztok!

Mostanság csinálom a Numerikus matek beadandó házimat, és miután korrektül leprogramoztam az algoritmusomat, a fordítás során egy érdekes hibaüzenet fogadott. Sorra nem ismerte linkelés során (asszem. Azaz "-c" opcióval simán lefordult, de linkelésnél már gondja volt) az általam használt sztenderd függvényeket.

Utánna néztem (nem volt nehéz, gyakorlatilag csak végigolvastam), sorra math.h -s függvényekkel volt a probléma (sqrt, pow, stb).

Mivel nem volt kedvem a teljes forrással bajlódnom, így hanyagul írtam egy kicsi "tesztelő forrást":
____________________
|#include <math.h>
|
|main()
|{
| double x;
|
| x = 12.1;
| sqrt(x);
|}
|____________________

Amit gcc xxx.c -ként lefordítva ezt az üzenetet kapom:
_____________________
|/tmp/ccyomojD.o(.text+0x2a): In function `main':
|: undefined reference to `sqrt'
|collect2: ld returned 1 exit status
|_____________________

Ebböl én azt hámoztam ki, hogy a math.h a helyén van, de valami gond lehet azzal a fájllal, amiben a math.h -s függvényei vannak object kódban.

Gondom ebböl egy valamilyen gcc korrigálás fog kikerekedni, de könnyen meglehet, hogy csak én vagyok a hülye, és egyszerűbben is meg lehet oldani.

Slackware 10.1 -et használok, és gcc 3.3.4 -et. (emlékeim szerint)

Ha esetleg valmait a gcc-ben kell mahinálni, akkor abban is kérek segítséget.

Köszönöm!

Asszem ezt kell megadnod:
-lm

Köszönöm!

De ez mindíg így volt? Én szentül meg voltam győződve, hogy az ANSI könyvtárakat külön gcc kapcsoló nélkül rendesen linkeli. Azt megértem, hogy ha pl. az ncurses -hez kell opció, de a math.h -hoz nem gondoltam volna...

Megyek, és megnézem!

szia,

a mathlib nem része a glibc-nek, ezért kell megadni a linkernek.

Sziasztok,

Nemregiben atvettem egy apro GPL-es progi (konzolos xmms frontend). A gazdijanak mar nem nagyon volt ideje karbantartani es dobott egy postot a sourceforge-ra, hogy ha barkit erdekel atveheti. Nos, nem akartam, hogy ujabb projekt "porosodjon" valamelyik eldugott szerveren igy amikor raakadtam a postra dobtam neki egy mailt es atvettem.

A gond eleg trivinek tunik, azokon a reszeken siman atmegy a gcc hiba nelkul amelyek a szabvanyos c nyelv ill. linux header-jeire hivatkoznak, viszont van ket header amelyeket egyaltalan nem szeret:
[code:1:f25a48e223]#include <xmms/xmmsctrl.h>
#include <ncurve.h>
[/code:1:f25a48e223]

A headereket latja, hiszen a fuggvenyek amikre a hibauzenet szol, (pl. lasd lejjeb: 'werase') azt onnan szedi ki. Ha kikommentelem a headereket, akkor mar a szokasos hibakat kapom, nemdefinialt hivatkozasoknal. Termezetesen a legfrisebb ncurve es xmms van fent.

Ime a hiba igy kezdodik:
[code:1:f25a48e223]xcplay.o(.text+0x18): In function `disphelp':
/home/tony/projects/xcplay/src/xcplay.c:400: undefined reference to `stdscr'
xcplay.o(.text+0x23):/home/tony/projects/xcplay/src/xcplay.c:400: undefined reference to `werase'
[/code:1:f25a48e223]
Es ez igy folytatodik kb 300 sor hosszan, mindenegyes hivatkozasnal nyafog. :)

A forraskod reszlet, amire a hibauzenet szol:
[code:1:f25a48e223]
....

void disphelp ()
{
int xs, ys;
while (sem != 0)
sleep(1);
sem++;
erase(); // <---------- A 400-adik sor ez lenne ahol a hiba kezdodik

xs = 4; //maxx / 2 - 20;
ys = maxy / 2 - 6;
mvprintw(ys++, xs, "h - help");
mvprintw(ys++, xs, "q - quit");

...

[/code:1:f25a48e223]

A segitsegeteket elore is koszonom. :)

gcc parameter:
[code:1:6ebe28cd0b]-lncurses[/code:1:6ebe28cd0b]
vagy vmi hasonlo...

Hát magam részéről: a werase az a (n)curses.h -ban definiált valami, sztem azt onnan veszi. Amúgy az stdscr is (n)curses -beli eszköz. Mi a franc az a ncurve.h ? Én egyébként mind a két említett fejléchivatkozást kacsacsőrök helyett idézőjelek közé raknám, lévén _nem_ a rendszer standard részei. Ebben az esetben egyébként valszeg kéne a cc -nek egy -I/itt/vannak/az/includeok paramétert is adni - ami mondjuk határozottan hordozhatóbb és szabványosabb megoldás, mint azt hinni, hogy pl. az xmms/xmmsctl.h fájl a /usr/include alatt van, ami sztem még Linuxon se minden disztribúcióra igaz, pláne nem igaz minden olyan rendszeren, amiben esetleg van xmms (pl. BSD-k), vagy ez a konzolos izé hozzá. (Esetleg egy linket is dobnál arról, hogy hol lehet ezt a forrást jobban megnézni?) Ja és miért is kell konzolos app-hoz linux-specifikus fejlécfájl?

[quote:53cfa6e26e="asm"]gcc parameter:
[code:1:53cfa6e26e]-lncurses[/code:1:53cfa6e26e]
vagy vmi hasonlo...[/quote:53cfa6e26e]
Koszi megoldotta. Most mar mukodik :)