Связь с gcc и-lm не определяет ceil() на Ubuntu

в настоящее время я использую GCC для компиляции и мне нужно использовать <math.h>. Проблема в том, что он не распознает библиотеку. Я также пробовал -lm и ничего. Функцию я пытался использовать был ceil() и я получаю следующую ошибку:

: undefined reference to `ceil'
collect2: ld returned 1 exit status

Я использую последние Ubuntu и math.ч есть. Я пытался использовать -lm на другом компьютере он работает отлично.

кто-нибудь знает как решить эту проблему?


Я есть <math.h>. Кроме того, я использовал команду:

gcc -lm -o fb file.c

3 ответов


возьмите этот код и поместите его в файл 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 появляется после имени исходного файла (или объектного файла, если вы компилируете источник в объект перед связыванием).


У вас недостаточно репутации, чтобы прокомментировать ответ @Jonathan Leffler. Просто хотел упомянуть, что книга Питера ван дер Линдена Expert C Programming имеет хорошее отношение к этому вопросу в главе 5 думая о связывании.

архивы (статические библиотеки) действуют иначе, чем общие объекты (динамические библиотеки). С помощью динамических библиотек все символы библиотеки попадают в виртуальное адресное пространство выходного файла, и все символы доступны для всех других файлов в ссылке. Напротив, статическое связывание просматривает архив только для неопределенных символов, известных загрузчику во время обработки архива.

Если вы укажете математическую библиотеку (которая обычно является статической) перед вашими объектными файлами, компоновщик не добавит никаких символов.


попробуйте скомпилировать так:

gcc -Wall -g file.c -lm -o file

У меня была такая же проблема и она была решена с помощью этой команды. Также, если вы установили Ubuntu в тот же день, когда у вас возникла проблема, это может быть проблема с обновлением.