Связывание с gcc и -lm не определяет ceil() на Ubuntu
В настоящее время я использую gcc для компиляции, и мне нужно использовать <math.h>
.
Проблема в том, что он не узнает библиотеку.
Я также пробовал -lm
и ничего.
Функция, которую я пыталась использовать, была ceil()
, и я получаю следующую ошибку:
: undefined reference to `ceil'
collect2: ld returned 1 exit status
Я использую последние Ubuntu и math.h.
Я попытался использовать -lm
на другом компьютере, и он отлично работает.
Кто-нибудь знает, как решить эту проблему?
Я включил <math.h>
. Кроме того, я использовал команду
gcc -lm -o fb file.c
Ответы
Ответ 1
Возьмите этот код и поместите его в файл ceil.c
:
#include <math.h>
#include <stdio.h>
int main(void)
{
printf("%f\n", ceil(1.2));
return 0;
}
Скомпилируйте его с помощью
$ gcc -o ceil ceil.c
$ gcc -o ceil ceil.c -lm
Один из этих двух должен работать. Если ни один из них не работает, покажите полное сообщение об ошибке для каждой компиляции. Обратите внимание, что -lm
появляется после имени исходного файла (или объектного файла, если вы скомпилируете источник для объекта перед связыванием).
Ответ 2
Не хватает репутации, чтобы комментировать ответ @Jonathan Leffler. Просто хотел упомянуть, что книга Питера ван дер Линдена Expert C Programming имеет хорошее отношение к этому вопросу в главе 5 Думая о связи.
Архивы (статические библиотеки) действуют иначе, чем общие объекты (динамические библиотеки). В динамических библиотеках все символы библиотеки входят в виртуальное адресное пространство выходного файла, и все символы доступны для всех других файлов в ссылке. Напротив, статическая привязка просматривает только архив для символов undefined, которые в настоящее время известны загрузчику во время обработки архива.
Если вы укажете математическую библиотеку (которая обычно является статической) перед вашими объектными файлами, то компоновщик не добавит никаких символов.
Ответ 3
Попробуйте выполнить компиляцию следующим образом:
gcc -Wall -g file.c -lm -o file
У меня была та же проблема, и она была решена с помощью этой команды. Также, если вы установили свой Ubuntu в тот же день, у вас возникла проблема, это может быть проблемой обновления.