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!
- A hozzászóláshoz be kell jelentkezni
Asszem ezt kell megadnod:
-lm
- A hozzászóláshoz be kell jelentkezni
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!
- A hozzászóláshoz be kell jelentkezni
szia,
a mathlib nem része a glibc-nek, ezért kell megadni a linkernek.
- A hozzászóláshoz be kell jelentkezni
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. :)
- A hozzászóláshoz be kell jelentkezni
gcc parameter:
[code:1:6ebe28cd0b]-lncurses[/code:1:6ebe28cd0b]
vagy vmi hasonlo...
- A hozzászóláshoz be kell jelentkezni
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?
- A hozzászóláshoz be kell jelentkezni
[quote:53cfa6e26e="asm"]gcc parameter:
[code:1:53cfa6e26e]-lncurses[/code:1:53cfa6e26e]
vagy vmi hasonlo...
Koszi megoldotta. Most mar mukodik :)
- A hozzászóláshoz be kell jelentkezni