Undefined reference to sin

Формулировка задачи:

undefined reference to `sin’

и то же самое про lround. Опытным путем понял, что если убрать

, то ошибка пропадает. но почему? в чем виновата i?))

I have the following code (stripped down to the bare basics for this question):

When compiling it with gcc test.c I get the following error, and I can’t work out why:

However, I’ve written various test programs that call sin from within the main function, and those work perfectly. I must be doing something obviously wrong here — but what is it?

4 Answers 4

You have compiled your code with references to the correct math.h header file, but when you attempted to link it, you forgot the option to include the math library. As a result, you can compile your .o object files, but not build your executable.

As Paul has already mentioned add " -lm " to link with the math library in the step where you are attempting to generate your executable.

Why for sin() in , do we need -lm option explicitly; but, not for printf() in ?

Because both these functions are implemented as part of the "Single UNIX Specification". This history of this standard is interesting, and is known by many names (IEEE Std 1003.1, X/Open Portability Guide, POSIX, Spec 1170).

The Standard C library is automatically searched by cc to resolve external references. This library supports all of the interfaces of the Base System, as defined in Volume 1, except for the Math Routines.

Standard C Mathematical Library

This library supports the Base System math routines, as defined in Volume 1. The cc option -lm is used to search this library.

Читайте также:  Таблица в эксель с формулами и расчетом

The reasoning behind this separation was influenced by a number of factors:

  1. The UNIX wars led to increasing divergence from the original AT&T UNIX offering.
  2. The number of UNIX platforms added difficulty in developing software for the operating system.
  3. An attempt to define the lowest common denominator for software developers was launched, called 1988 POSIX.
  4. Software developers programmed against the POSIX standard to provide their software on "POSIX compliant systems" in order to reach more platforms.
  5. UNIX customers demanded "POSIX compliant" UNIX systems to run the software.

The pressures that fed into the decision to put -lm in a different library probably included, but are not limited to:

  1. It seems like a good way to keep the size of libc down, as many applications don’t use functions embedded in the math library.
  2. It provides flexibility in math library implementation, where some math libraries rely on larger embedded lookup tables while others may rely on smaller lookup tables (computing solutions).
  3. For truly size constrained applications, it permits reimplementations of the math library in a non-standard way (like pulling out just sin() and putting it in a custom built library.

In any case, it is now part of the standard to not be automatically included as part of the C language, and that’s why you must add -lm .

У меня есть следующий код (разделенный на простые основы для этого вопроса):

При компиляции с gcc test.c я получаю следующую ошибку, и я не могу понять, почему:

Однако я написал различные тестовые программы, которые вызывают sin из функции main , и они работают отлично. Я должен делать что-то явно неправильно здесь, но что это такое?

Читайте также:  Ускорение силы сопротивления воздуха

Вы скомпилировали свой код со ссылками на правильный файл заголовка math.h, но когда вы попытались связать его, вы забыли возможность включить математическую библиотеку. В результате вы можете скомпилировать ваши объектные файлы .o, но не создавать свой исполняемый файл.

Как уже упоминал Павел, добавьте " -lm ", чтобы связать с математической библиотекой шаг, на котором вы пытаетесь сгенерировать свой исполняемый файл.

Почему для sin() в нам нужна опция -lm явно; но, не для printf() в ?

Потому что обе эти функции реализованы как часть "Single UNIX Specification". Эта история этого стандарта интересна и известна под многими именами (IEEE Std 1003.1, X/Open Portability Guide, POSIX, Spec 1170).

Библиотека Standard C автоматически просматривается cc для устранения внешних ссылок. Эта библиотека поддерживает все интерфейсов базовой системы, как определено в томе 1, за исключением Математические методы.

Стандартная математическая библиотека C

Эта библиотека поддерживает математические процедуры базовой системы, как определено в томе 1. Параметр cc -lm используется для поиска в этой библиотеке.

В основе этих разделов лежал ряд факторов:

  • Войны UNIX привели к увеличению расхождения с исходным предложением AT & T UNIX.
  • Количество платформ UNIX затруднило разработку программного обеспечения для операционной системы.
  • Была запущена попытка определить самый низкий общий знаменатель для разработчиков программного обеспечения, называемый 1988 POSIX.
  • Разработчики программного обеспечения, запрограммированные против стандарта POSIX, предоставляют свое ПО на "совместимых с POSIX системах", чтобы достичь большего количества платформ.
  • Клиенты UNIX потребовали, чтобы UNIX-системы, совместимые с POSIX, запускали программное обеспечение.

Давления, которые принимались в решение о размещении -lm в другой библиотеке, вероятно, включали, но не ограничивались:

  • Кажется, это хороший способ сохранить размер libc down, так как многие приложения не используют функции, встроенные в математическую библиотеку.
  • Он обеспечивает гибкость в реализации математической библиотеки, где некоторые математические библиотеки полагаются на более крупные встроенные таблицы поиска, в то время как другие могут полагаться на более мелкие таблицы поиска (вычислительные решения).
  • Для приложений с ограниченным ограничением по размеру он позволяет выполнять переопределения математической библиотеки нестандартным способом (например, вытаскивать только sin() и помещать его в пользовательскую встроенную библиотеку.
Читайте также:  Pay later что это

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