2011-12-29 5 views
100

Я пытаюсь сделать простой калькулятор фибоначчи в C, но когда компиляция gcc говорит мне, что мне не хватает функций pow и floor. Что не так?Неопределенная ссылка на `pow 'и` floor'

Код:

#include <stdio.h> 
#include <math.h> 

int fibo(int n); 

int main() { 
     printf("Fib(4) = %d", fibo(4)); 
     return 0; 
} 

int fibo(int n) { 
     double phi = 1.61803399; 

     return (int)(floor((float)(pow(phi, n)/sqrt(5)) + .5f)); 
} 

Выход:

[email protected]:~/work/c/fibo$ gcc fib.c -o fibo 
/tmp/ccNSjm4q.o: In function `fibo': 
fib.c:(.text+0x4a): undefined reference to `pow' 
fib.c:(.text+0x68): undefined reference to `floor' 
collect2: ld returned 1 exit status 
+0

Поскольку точность с плавающей запятой не бесконечна, это даст неправильные ответы на не столь большие значения 'n' – vonbrand

ответ

194

Вы должны компилировать с флагом -lm, как это:

gcc fib.c -lm -o fibo 

Это скажет GCC, чтобы связать код с математическая библиотека. Просто не забудьте поставить флаг после объектов, которые вы хотите связать.

+6

Не могли бы вы объяснить, как разработать письмо для ввода после -l? –

+41

Смотрите в/lib или/usr/lib. Все библиотеки называются 'lib .a' или' lib .so' - это «», который вы ставите после '-l'. В этом случае математическая библиотека называется 'libm.so', поэтому мы называем ее' -lm'. – ams

+3

Спасибо! Я занимаюсь поиском в Интернете за последние 30 минут, и это первая ссылка, которая связывает библиотеки после объектов –

24

Добавить -lm в параметры линии связи, так как пау() и напольные() являются частью математической библиотеки:

gcc fib.c -o fibo -lm 
6

Чтобы найти точку, где добавить -lm в Eclipse, IDE действительно ужасно, поэтому мне потребовалось некоторое время.

Если кто-то использует Edlipse, вот так, как добавить команду:

Проект -> Свойства -> C/C++ Build -> Настройки -> GCC C Linker -> Miscelleaneous -> Linker флаги: в этой области добавьте команду -lm

8

в отношении к ответу, предоставленной Fuzzy:

Я на самом деле должен был сделать что-то немного другое.

Проект -> Свойства -> C/C++ Build -> Настройки -> GCC C Linker -> Библиотеки

Нажмите на маленькую зеленую иконку надстройку, тип м и нажмите кнопку ОК. Все в этом окне автоматически использует -l, поскольку это библиотека.

9

В пользу тех, кто читает это позже, вы должны связать с ним, как Фред сказал:

НКУ fib.c -lm -o фибо

Один хороший способ, чтобы выяснить, какие библиотеки вам нужно чтобы связать это путем проверки справочной страницы, если таковая существует. Например, «man pow» и «man floor» расскажут вам:

Ссылка на -lm.

Смежные вопросы