Неопределенная ссылка на `pow 'и` floor' - PullRequest
110 голосов
/ 29 декабря 2011

Я пытаюсь сделать простой калькулятор Фибоначчи на C, но при компиляции gcc говорит мне, что мне не хватает функций 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));
}

Вывод:

gab@testvm:~/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

Ответы [ 5 ]

221 голосов
/ 29 декабря 2011

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

gcc fib.c -lm -o fibo

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

24 голосов
/ 29 декабря 2011

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

gcc fib.c -o fibo -lm
9 голосов
/ 15 мая 2015

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

gcc fib.c -lm -o fibo

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

Связь с -lm.

Объяснение для связи математической библиотеки в программировании на C - Связывание в C

8 голосов
/ 23 июня 2014

Что касается ответа, предоставленного Fuzzy:

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

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

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

6 голосов
/ 16 октября 2013

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

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

Проект -> Свойства -> Сборка C / C ++ -> Настройки -> GCC C Linker -> Разное -> Флажки компоновщика: в этом поле добавьте команду -lm

...