C -be irt program nem fordul

Fórumok

C -be irt program nem fordul

Hozzászólások

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!

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

Koszi megoldotta. Most mar mukodik :)