C Не удалось скомпилировать: не удается найти функции math.h

Я пишу поиск простых чисел. Математически, это быстрее, чем делать for (unsigned long i = 2; i < number/2; i++) это намного быстрее, и все еще столь же эффективно, чтобы сделать for (unsigned long i = 2; i < sqrt(number); i++)

Но это не работает. Ниже мой код.

// Stuff goes up here, including a function prototype and:
#include <math.h>
char isPrime (unsigned long number)
{
    if (number <= 1) {
    return 0;
    }
    long double sqrtOfNumber = sqrt(number); // Calculate once.
    for (unsigned long i = 2; i < sqrtOfNumber; i++) {
        if (number%i == 0) { // It has a divisor.
            return 0;
        }
    }
    // Nothing broke us yet....
    return 1;
}

И тогда ниже - ошибка, которую я получаю от GCC.

/tmp/ccFBlUz5.o: In function `isPrime':
main.c:(.text+0xb3): undefined reference to `sqrt'
collect2: error: ld returned 1 exit status

Изменение типа "число" на двойное вызывает проблемы с оператором%. И приведение его к удвоению для вызова sqrt() ничего не меняет.

Любой совет?

Да, и мой math.h импортируется, если я закомментирую эту строку, меня предупреждают, что там есть неявное объявление.

    main.c: In function 'isPrime':
    main.c:28:2: warning: implicit declaration of function 'sqrt' [-Wimplicit-function-declaration]
    long double sqrtOfNumber = sqrt(number); // Calculate once.
    ^
    main.c:28:29: warning: incompatible implicit declaration of built-in function 'sqrt' [enabled by default]
    long double sqrtOfNumber = sqrt(number); // Calculate once.
                         ^

плюс другое предупреждение под этим.

2 ответа

Решение

-lm необходимо добавить в командную строку после файла, который требует эту библиотеку, например, если main.c требуется математическая библиотека, то вы будете использовать:

 gcc -x c main.c -lm 

Вы можете увидеть живой пример здесь, в этом примере доступны три командные строки. Один без -lmодин с -lm перед файлом, который нуждается в этом один после файлов, которые нуждаются в этом.

Для полноты картины, если мы обращаемся к документации gcc по опциям для ссылки, это говорит следующее для -l:

[...] Это имеет значение, где в команде вы пишете эту опцию; компоновщик ищет и обрабатывает библиотеки и объектные файлы в указанном порядке. Таким образом, 'foo.o -lz bar.o' ищет библиотеку 'z' после файла foo.o, но перед bar.o. Если bar.o ссылается на функции в "z", эти функции могут быть не загружены. [...]

Вам нужно связать математическую библиотеку. Использовать -lm опция в командной строке.

Другие вопросы по тегам