Вопрос по gcc, c – Зачем вам нужна явная опция компилятора `-lm` [duplicate]

10

Possible Duplicate:
gcc: why the -lm flag is needed to link the math library?

Вообще говоря, для того, чтобы использовать любую из математических функций помимо включения файла заголовкаmath.h Вы должны связать с опцией компоновщика -lm.-l здесь подразумевается опция компоновщика для поиска конкретной библиотекиlibm.o.

Мой вопрос

Почему GCC не включает эту библиотеку по умолчанию? Это потому, что библиотека интенсивно использует математический сопроцессор и требует добавления дополнительного бита кода для инициализации инициализации с плавающей запятой (здесь я могу использовать неправильную терминологию)?

Note

Я только что рассмотрел все ответы, упомянутые в ссылкеhttp://stackoverflow.com, Это не имеет большого смысла для меня. Есть три основные причины

The standard libraries are guaranteed to be available. Linking other posix libraries like pthread explicitly makes sense, but why do we have to do an explicit link for a standard library. Even the historical reason is not very clear. Why was libm separated from libc? Why are we still inheriting these behaviors in the recent gcc compilers? What simplicity it achives? Here is what I tested, without libm and with libm. The One without libm, I have written my own version of Pow

Вот пример

[email protected]:~/Projects/GIPL6_2$ ls -1 Test_*|xargs -I{} sh -c "echo {} && echo "-----------------" && cat {}"
Test_withlibm.c
-----------------
#include<stdio.h>
#include<math.h>
int main() {
    int i=20;
    double output1=pow(2.618033988749895,i);
    return 0;
    }
Test_withoutlibm.c
-----------------
#include<stdio.h>
#include<math.h>
double Pow(double _X, int _Y)  {
    double _Z = 1;
    for (; _Y; _X *= _X) {
    if (_Y & 1) _Z *= _X;
    _Y >>= 1;
    }
    return _Z; 
    }
int main() {
    int i=20;
    double output1=Pow(2.618033988749895,i);
    return 0;
    }
[email protected]:~/Projects/GIPL6_2$ gcc Test_withlibm.c -lm -o Main_withlibm.o
[email protected]:~/Projects/GIPL6_2$ gcc Test_withoutlibm.c -o Main_withoutlibm.o
[email protected]:~/Projects/GIPL6_2$ objdump -d Main_withoutlibm.o|wc -l
261
[email protected]:~/Projects/GIPL6_2$ objdump -d Main_withlibm.o|wc -l
241
Исторические причины, я думаю. Компоновщик должен легко иметь возможность не связывать функции, которые не используются. MSVC также не требуется libm, чтобы вы могли использовать математические функции. Joey
Вам не нужно это с C ++. Mat

Ваш Ответ

3   ответа
1

libm это только один из них.
Для каждого из них вы можете спросить, почему он не включен по умолчанию.

возможноlibm более полезен, чем другие, но, тем не менее, C предпочитает сохранять простоту - вы хотите библиотеку, используйте-l использовать это.

Но в чем уникальностьlibm является то, что он является частью стандартной библиотеки C. AFAIK, это единственная часть стандартной библиотеки C, которая не связана по умолчанию.
@ OliCharlesworth, хорошая мысль. Было бы неплохо, если бы «стандарт» и & quot; связаны по умолчанию & quot; были одно и то же.
Я не покупаю "держать вещи простыми" аргумент. Они могли бы сделать вещи еще проще, не связываяlibc по умолчанию. Вам это не нужно в каждой программе, просто посмотрите:main(){} - увидеть? Зачем мне ссылкуlibc к этому?
1

Historical reasons

Причиныlibc а такжеlibm разделены, и вы должны указать-lm в командной строке исторические причины, потому чтоlibm также использовался компилятором Фортрана.

Таким образом, тот же самый libm может использоваться совместно с Fortran, и C был причиной разделения? Когда мы связывали программу на Фортране, мы должны были-lm как мы идем с gcc? Abhijit
9

где математика с плавающей запятой невозможна или не нужна. Это действительно что-то вроде исторического, но не забывайте, чтоgcc и большинство других компиляторов Си были написаны в то время, когда 386SX считался высокопроизводительным процессором.

В качестве примера, когда я еще работал во встроенных вычислениях, мы использовали стандартные компиляторы (Microsoft и Borland) для генерации кода для наших процессоров (Z80, 80186 и 68030). Если бы компиляторы по умолчанию были связаны с математической библиотекой, у нас были бы проблемы, поскольку ни одна из наших систем не имела возможностей с плавающей запятой или даже не нуждалась в них.

Это правда, что спустя 30 лет это кажется глупым, но причина была серьезной в то время.

Похожие вопросы