2013-08-05 2 views
3

Я смущен, почему вы должны набрать -lm, чтобы правильно связать математику с вашим кодом, но не нужно делать то же самое для stdio. Я только начал использовать C, поэтому прошу прощения, если это глупый quesiton, или я пропускаю что-то очевидное.<stdio.h> vs <math.h> - Зачем вам связывать одно, а не другое?

+3

http://stackoverflow.com/questions/1033898/why-do-you-have-to-link-the-math-library-in-c?rq=1 – verbose

+0

'* .h' файлы являются файлами заголовков , файлы заголовков ** не ** связаны, заголовки ** 'include'ed **! – alk

ответ

3

Есть две разные вещи:

  • файлы заголовков (stdio.h и math.h) - они содержат только прототипы функций и некоторые определения и данных; они #include d в исходном коде
  • библиотеки (libm.so) - они содержат двоичный код, который будет связан обратно в приложение (двоичного кода). Кроме того, для библиотеки с именем libname.so флаг компоновщика -lname - для libm.so - флаг -lm.

Примите во внимание, что существуют libc.so и libstdc.so, которые всегда связаны с вашим приложением. Код для функций в stdio.h и stdlib.h и некоторые другие находятся в этих библиотеках - таким образом, он всегда включен.

PS: Я предполагаю Linux/UNIX здесь, поэтому имена очень специфичны. В Windows вещи похожи, но с другими названиями (DLL вместо .so файлов и т.д.)

+0

Имена 'libm.so',' libc.so' и т. Д. Очень специфичны для системы. Но тогда также необходимо использовать '-lm' для связывания математической библиотеки. –

+0

Спасибо, упомянул, что в PS. –

5

Короче говоря, из-за исторических причин,

Функции в stdio.h в libc, в то время как функции math.h в libm. libc связан по умолчанию, но libm нет.

+0

s/was/is /, чтобы быть правильным. – glglgl

+0

И исторические причины были, в то время как практически всем нужен код в 'libc', код в' libm' требовался только несколькими приложениями. – DevSolar

Смежные вопросы