Forum » Programiranje » gcc + math.h + -lm problem
gcc + math.h + -lm problem
Bor H ::
Torej, upam da sem dovolj googlal preden se obrnem na vas... Problem imam z knjižnico math.h in Cjem, na internetu sem našel kot univerzalno rešitev komadno -lm, žal mi ne deluje. Program se mi začne približno tako
ko probam compilat uporabim ukaz: gcc -lm naloga1b.c
odgovor, ki ga dobim je
Uporabljam pa najnovejši Ubuntu, brskal sem tudi po disku in sem prepričan da sem math.h nekje videl. Sem pa dokaj začetnik v tem in seveda dopuščam možnost da sem kej totalno kapitalnega mim usekal, upam da mi uspe kdo pomagat.
Hvala!
#include<stdio.h> #include<math.h> double F(double x) //uvedba funkcije x?e(-x) { double result=x*x*exp(-x); return result; }
ko probam compilat uporabim ukaz: gcc -lm naloga1b.c
odgovor, ki ga dobim je
/tmp/ccrGc7aC.o: In function `F': naloga1b.c:(.text+0x48): undefined reference to `exp' collect2: ld returned 1 exit status
Uporabljam pa najnovejši Ubuntu, brskal sem tudi po disku in sem prepričan da sem math.h nekje videl. Sem pa dokaj začetnik v tem in seveda dopuščam možnost da sem kej totalno kapitalnega mim usekal, upam da mi uspe kdo pomagat.
Hvala!
- spremenil: Bor H ()
Glodko ::
Mal pogooglej za razlikami gcc vs. g++. Ne vem kako je s tem na Windowsih, na Linux in Mac OS X platformi se program z vgrajenimi matematičnimi funkcijami prevede uspešno samo z g++ (no vsaj jest nisem našel boljše rešitve). Če boš vgrajene matematične funkcije zamenjal s svojimi, torej da math.h ne boš uporabljal, pa se bo z gcc prevedlo bp.
Bor H ::
Zanimivo, ker ja, gcc je lepo delal dokler nisem uvajal funkcij izven stdio.h, se bom zdj raje držal g++ :)
fiction ::
g++ reši problem, ker se potem datoteka prevede kot C++ in ne več kot C source (je pa velika verjetnost, da je veljaven program v C-ju tudi veljaven program v C++, čeprav obstajajo določene obskurnosti za katere to ni res).
Khm, res lahko reproduciram tvoj problem z gcc 4.6.1, medtem ko na eni prejšnji verziji vse skupaj normalno dela. Ampak zadevo lahko rešim tako, da dam -lm na koncu ukazne vrstice. Manual od gccja nekaj govori o tem, da je -l placement order pomemben, ampak ne vem pa od kdaj je to tako.
Khm, res lahko reproduciram tvoj problem z gcc 4.6.1, medtem ko na eni prejšnji verziji vse skupaj normalno dela. Ampak zadevo lahko rešim tako, da dam -lm na koncu ukazne vrstice. Manual od gccja nekaj govori o tem, da je -l placement order pomemben, ampak ne vem pa od kdaj je to tako.
Bor H ::
Sem probal dati -lm na konec pa ni delovalo, mogoče sem pa takrat kej drugega narobe naredu. Uglavnem zadeva zdj dela, je pa dost bizarna :)
Mavrik ::
No če boš C kodo prevajal s C++ prevajalnikom boj previden da te kaj ne ugrizne. Prav tako poglej na kere knjižnice si linkan.
Pa prišli te bomo zbrcat nazaj v srednji vek če boš pisal C programe ko se jih ne da prevajat s C prevajalniki ;) fictionov "nasvet" je tako nekaj najslabšega kar lahko narediš.
Pa prišli te bomo zbrcat nazaj v srednji vek če boš pisal C programe ko se jih ne da prevajat s C prevajalniki ;) fictionov "nasvet" je tako nekaj najslabšega kar lahko narediš.
The truth is rarely pure and never simple.
fiction ::
Moj nasvet? Jaz sem samo povzel dejstva. Da se zadeva "reši" z g++ ni zraslo na mojem zelniku. Ali kaj je mišljeno?
Kar se tiče kompatibilnosti med C in C++. Spet ni bilo mišljeno kot vzpodbuda za uporabo takih konstruktov, ampak samo kot protiprimer, da ni vsaka veljavna C koda tudi veljavna C++ koda in je dobro paziti kot kaj prevajaš tvojo izvorno kodo.
in tukaj ne najdem ničesar pametnega zakaj bi 4.6 verzija delovala drugače.
Kar se tiče kompatibilnosti med C in C++. Spet ni bilo mišljeno kot vzpodbuda za uporabo takih konstruktov, ampak samo kot protiprimer, da ni vsaka veljavna C koda tudi veljavna C++ koda in je dobro paziti kot kaj prevajaš tvojo izvorno kodo.
fiction@netbook:~$ gcc a.c -lm
fiction@netbook:~$ gcc -lm a.c
/tmp/ccmnR5xS.o: In function `f':
a.c:(.text+0x19): undefined reference to `exp'
collect2: ld returned 1 exit status
fiction@netbook:~$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/i686-linux-gnu/4.6.1/lto-wrapper
Target: i686-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.6.1-9ubuntu3' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++,go --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-plugin --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=i686-linux-gnu --host=i686-linux-gnu --target=i686-linux-gnu
Thread model: posix
gcc version 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3)
vs.
fiction@eye:~$ gcc a.c -lm
fiction@eye:~$ gcc -lm a.c
fiction@eye:~$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.5.2-8ubuntu4' --with-bugurl=file:///usr/share/doc/gcc-4.5/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.5 --enable-shared --enable-multiarch --with-multiarch-defaults=x86_64-linux-gnu --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib/x86_64-linux-gnu --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.5 --libdir=/usr/lib/x86_64-linux-gnu --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-plugin --enable-gold --enable-ld=default --with-plugin-ld=ld.gold --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4)
in tukaj ne najdem ničesar pametnega zakaj bi 4.6 verzija delovala drugače.
BigWhale ::
Na Ubuntu 11.10 64bit z gcc version 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3) dela povsem po pricakovanjih.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | K3B problemOddelek: Operacijski sistemi | 1280 (1158) | theD3viL- |
» | GCC 4.0!Oddelek: Programiranje | 2540 (1784) | 64202 |
» | unmergal sem gccOddelek: Operacijski sistemi | 1893 (1639) | borchi |
» | Problemi s compilanjem v Linux Slackware 9.1Oddelek: Operacijski sistemi | 1889 (1608) | Vesoljc |
» | Hash table - C++Oddelek: Programiranje | 1310 (1186) | noraguta |