Подтвердить что ты не робот

Связывание с 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
4b9b3361

Ответ 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 в тот же день, у вас возникла проблема, это может быть проблемой обновления.