Ответ 1
Вам нужно скомпилировать флаг -lm
, например:
gcc fib.c -lm -o fibo
Это скажет gcc, чтобы связать ваш код с математическим lib. Просто не забудьте поставить флаг после объектов, которые вы хотите связать.
Я пытаюсь сделать простой калькулятор фибоначчи в 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));
}
Вывод:
[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
Вам нужно скомпилировать флаг -lm
, например:
gcc fib.c -lm -o fibo
Это скажет gcc, чтобы связать ваш код с математическим lib. Просто не забудьте поставить флаг после объектов, которые вы хотите связать.
Добавьте -lm в свои параметры ссылок, так как pow() и floor() являются частью математической библиотеки:
gcc fib.c -o fibo -lm
В интересах любого, кто читает это позже, вам нужно связать его, как сказал Фред:
gcc fib.c -lm -o fibo
Один хороший способ узнать, какую библиотеку вам нужно связать, - это проверить man-страницу, если таковая существует. Например, "man pow" и "man floor" расскажут вам:
Ссылка на -lm.
В отношении ответа, предоставленного Fuzzy:
Мне действительно нужно было сделать что-то немного другое.
Проект → Свойства → C/С++ Build → Настройки → GCC C Linker → Библиотеки
Щелкните значок маленького зеленого значка, введите m и нажмите ОК. Все в этом окне автоматически использует -l, поскольку это библиотека.
Чтобы найти точку, где добавить -lm в Eclipse-IDE действительно ужасно, мне потребовалось некоторое время.
Если кто-то еще использует Edlipse, вот как добавить команду:
Project → Properties → C/С++ Build → Settings → GCC C Linker → Miscelleaneous → Флаги компоновщика: в этом поле добавить команду -lm