» »

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

#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 ::

Prevedi namesto z gcc z "g++ naloga1b.c"

Bor H ::

Hudiča, to je deloval. Hvala. Mi zaupaš v čem je hec?

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.

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


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

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

K3B problem

Oddelek: Operacijski sistemi
71296 (1174) theD3viL-
»

GCC 4.0!

Oddelek: Programiranje
362560 (1804) 64202
»

unmergal sem gcc

Oddelek: Operacijski sistemi
421920 (1666) borchi
»

Problemi s compilanjem v Linux Slackware 9.1

Oddelek: Operacijski sistemi
351910 (1629) Vesoljc
»

Hash table - C++

Oddelek: Programiranje
51319 (1195) noraguta

Več podobnih tem