Я пытаюсь сделать простой калькулятор Фибоначчи на 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
c
gcc
undefined-reference
Габриэле Чирулли
источник
источник
n
Ответы:
Вам нужно скомпилировать с флагом ссылки
-lm
, например:Это скажет gcc связать ваш код с математической библиотекой. Только не забудьте поставить флажок после объектов, которые вы хотите связать.
источник
lib<name>.a
илиlib<name>.so
- это "<имя>", которое вы ставите после-l
. В этом случае математическая библиотека названаlibm.so
так, как мы ее называем-lm
.Добавьте -lm к параметрам ссылки, поскольку pow () и floor () являются частью математической библиотеки:
источник
Для тех, кто прочтет это позже, вам нужно дать ссылку на это, как сказал Фред:
Хороший способ узнать, какую библиотеку нужно связать, - это проверить страницу руководства, если таковая существует. Например,
man pow
иman floor
оба скажут вам:Связать с
-lm
.Объяснение связывания математической библиотеки в программировании на C - Связывание в C
источник
Что касается ответа, предоставленного Fuzzy:
На самом деле мне пришлось сделать что-то немного другое.
Проект -> Свойства -> Сборка C / C ++ -> Настройки -> Компоновщик GCC C -> Библиотеки
Щелкните маленький зеленый значок добавления, введите m и нажмите ОК. Ко всему в этом окне автоматически применяется -l, поскольку это библиотека.
источник
Найти точку, в которой добавить -lm в Eclipse-IDE, действительно ужасно, поэтому мне потребовалось время.
Если кто-то еще использует Edlipse, вот как добавить команду:
Проект -> Свойства -> Сборка C / C ++ -> Настройки -> GCC C Linker -> Разное -> Флаги компоновщика: в это поле добавьте команду -lm
источник
Все ответы выше неполны, проблема здесь в компоновщике,
ld
а не в компилятореcollect2: ld returned 1 exit status
. Когда вы компилируете свойfib.c
объект to:Где
nm
перечисляет символы из объектного файла. Вы можете видеть, что это было скомпилировано без ошибок, ноpow
,floor
иprintf
функции имеют неопределенные ссылки, теперь, если я попытаюсь связать это с исполняемым файлом:Я получаю тот же результат, что и вы. Чтобы решить эту проблему, мне нужно указать компоновщику, где искать ссылки
pow
, иfloor
для этой цели я буду использовать-l
флаг компоновщика,m
который поступает изlibm.so
библиотеки.Теперь вы можете видеть, функции
pow
,floor
которые связаны сGLIBC_2.2.5
.Порядок параметров также важен, если ваша система не настроена на использование общих библиотек по умолчанию, моя система нет, поэтому, когда я выдаю:
Отметьте
-lm
флаг перед объектным файлом. Итак, в заключение, добавьте-lm
флаг после всех других флагов и параметров, чтобы быть уверенным.источник