2011-11-25 5 views
10

Obecnie używam gcc do kompilacji i potrzebuję użyć <math.h>. Problem polega na tym, że nie rozpoznaje biblioteki. Próbowałem również -lm i nic. Funkcja Próbowałem użyć było ceil() i pojawia się następujący błąd:Łączenie z gcc i -lm nie definiuje ceil() na Ubuntu

: undefined reference to `ceil' 
collect2: ld returned 1 exit status 

używam najnowszego Ubuntu i math.h ma. Próbowałem użyć -lm w innym komputerze i działa idealnie.

Czy ktoś wie, jak rozwiązać ten problem?


Dołączyłem <math.h>. Również komenda Kiedyś było:

gcc -lm -o fb file.c 
+4

Czy możesz podać pełną linię poleceń, z której korzystasz? – Gian

+0

A czy pamiętasz '#include ' zanim użyjesz 'ceil'? –

+0

Zawarłem także math.h Poleceniem, którego użyłem było: gcc -lm -o fb file.c – drum

Odpowiedz

17

Weź ten kod i umieścić go w pliku ceil.c:

#include <math.h> 
#include <stdio.h> 
int main(void) 
{ 
    printf("%f\n", ceil(1.2)); 
    return 0; 
} 

skompilować z:

$ gcc -o ceil ceil.c 
$ gcc -o ceil ceil.c -lm 

jednej z tych dwóch powinno działać . Jeśli żaden z nich nie działa, pokaż pełny komunikat o błędzie dla każdej kompilacji. Zauważ, że -lm pojawia się po nazwie pliku źródłowego (lub pliku obiektowego, jeśli kompilujesz źródło do obiektu przed połączeniem).

+0

@Johnathan Leffler Czy istnieje sposób, aby to zrobić bez stosowania tm-lm za każdym razem podczas kompilacji? – Brandon

+0

@Brandon: Migrate to Mac? Funkcje z '' są w głównej bibliotece systemowej, więc nie musisz określać '-lm' (chociaż istnieje' libm.dylib', aby udostępnić bibliotekę do połączenia, jeśli podasz '-lm' w wierszu poleceń). W przeciwnym razie, upewnij się, że używasz pliku makefile i jeśli używasz go na tyle, aby to gwarantować, masz ustawiony plik 'LDLIBS' (lub' LDLIBES') 'lub napisz reguły dotyczące programu, które obejmują/wykluczają bibliotekę jako wymagane przez każdy program. Innymi słowy: "Nie, nie ma sposobu na uniknięcie jej określenia". Możesz zapytać zespół GLibC, dlaczego nie poszli do jednej biblioteki. –

+0

Należy zauważyć, że jeśli zoptymalizujesz kod, możliwe jest, aby kompilator ocenił 'ceil (1.2)' podczas kompilacji i uniknął konieczności wywoływania funkcji w czasie wykonywania, w takim przypadku może nie być potrzebna biblioteka '-lm' w ogóle. Ale byłby to mało prawdopodobny argument dla prostego programu na moim przykładzie - ogólnie kompilator nie byłby w stanie dokonać tej optymalizacji, a następnie musiałbyś połączyć się z biblioteką matematyczną, chyba że funkcje są już w głównym biblioteka systemowa. –

9

Nie masz wystarczającej reputacji, aby skomentować odpowiedź @ Jonathan Leffler. Chciałem tylko wspomnieć, że książka Petera van der Lindena Expert C Programming jest dobrze traktowana na ten temat w rozdziale 5 Thinking of Linking.

Archives (static libraries) are acted upon differently than are shared objects (dynamic libraries). With dynamic libraries, all the library symbols go into the virtual address space of the output file, and all the symbols are available to all the other files in the link. In contrast, static linking only looks through the archive for the undefined symbols presently known to the loader at the time the archive is processed.

Jeśli określisz bibliotekę matematyczną (która zwykle jest statyczna) przed plikami obiektów, linker nie doda żadnych symboli.

2

Spróbuj kompilacji tak:

gcc -Wall -g file.c -lm -o file 

miałem ten sam problem i został rozwiązany za pomocą tego polecenia. Również jeśli zainstalowałeś Ubuntu tego samego dnia, w którym wystąpił problem, może to być problem z aktualizacją.

+1

To pytanie już dawno zostało odebrane. – drum