C 使用头文件编译

C 使用头文件编译,c,gcc,C,Gcc,为什么我必须用以下代码编译C源文件: gcc prog.c -lm 即使我已经将特定头文件包含在以下文件中: #include <math.h> #包括 因为在C中,头文件和库之间在技术上完全没有连接。头文件可以比库多,反之亦然。在大多数情况下,1:1关系只是一个惯例问题(当然也有一定道理)。因为您需要通知编译器要链接哪个数学库,而与math.h包含无关。包含文件告诉编译器函数的外观,以及它返回的类型,它需要多少类型的参数,但它不会告诉编译器内容 -lm标志包括实际的数学库,其中

为什么我必须用以下代码编译C源文件:

gcc prog.c -lm
即使我已经将特定头文件包含在以下文件中:

#include <math.h>
#包括

因为在C中,头文件和库之间在技术上完全没有连接。头文件可以比库多,反之亦然。在大多数情况下,1:1关系只是一个惯例问题(当然也有一定道理)。

因为您需要通知编译器要链接哪个数学库,而与math.h包含无关。

包含文件告诉编译器函数的外观,以及它返回的类型,它需要多少类型的参数,但它不会告诉编译器内容

-lm
标志包括实际的数学库,其中包含要调用的函数的代码


它与
printf()
fread()
和其他标准函数的工作方式相同。如果包含
stdio.h
,则实际上不包含函数的代码,而是包含定义。因为C库是隐式链接的,您不必做任何事情,所以您不会注意到它。

与您自己的代码类似,它应该有头文件(
.h
)用于函数声明,源文件(
.C
)用于函数定义,数学库的代码分为两部分。包含的头文件包含函数声明:

double sqrt(double n);

但是,它没有包含任何关于这些函数如何工作的内容。此代码位于一个单独的文件中,您必须将其链接到其中,这与您链接不同的源文件以创建应用程序的方式类似。

的确如此,我希望我能说明为什么不以相同的方式处理它(Windows除外)。。。但我不知道。这一点很清楚,tho:)