当我在代码中指定了头文件时,为什么需要在gcc编译命令中指定库?

时间:2011-10-26 13:35:19

标签: c glfw

我在* .c程序中使用GLFW库。

    #include <GL/glfw.h>
    #include <stdlib.h>

    int main(void)
    {
        int running = GL_TRUE;
        int k=0;
.....
...
..

我用来编译的命令是:

gcc test1.c -o test1 -lglfw

我的问题是,因为这条线存在:

#include <GL/glfw.h>

为什么我必须将-lglfw传递给gcc

3 个答案:

答案 0 :(得分:6)

GL / glfw.h是一个头文件,它声明所有的类型,常量,函数,你知道钻取,它是让编译器知道要生成什么代码并使它不是抱怨未知标识符。 libglfw是一个包含实际二进制代码的库(或稍后将由动态链接器绑定的存根,或类似的东西),你必须与它链接以使链接器不抱怨未解决符号。

标头可能包含库的实际代码(因此编译器将为使用库的每个翻译单元反复生成二进制代码),它被称为然后是一个只有头文件库,但在C世界中,这些库不是你经常可以找到的东西,而且这个特定的库不是只有头文件。

答案 1 :(得分:1)

我不知道具体的GLFW库。但是,#include编译器的预处理程序指令(如果您错过了,您的代码将无法编译),但-lglfw参数适用于链接器(如果您错过了,代码将被编译为目标文件,但您将通过链接器获得未定义的符号。)

有些(稀有)库只是标题内容;它们完全在#include - d标题中提供功能。我只知道一个这样的库(GNU闪电)。

大多数库作为共享或静态库文件(即lib*.solib*.a文件)存在。它们提供的功能是已编译的代码,您需要将其链接到可执行文件中。

详细了解linkers

答案 2 :(得分:1)

好吧,头文件(带有.h)只包含say函数,变量类等的声明。因此,通过在.c文件中包含头文件,可以使编译器知道函数等的声明。这意味着,编译器能够生成实际调用函数的命令。

然而,函数的定义(即实际实现)是完全不同的东西,它(通常)存在于头文件中(仅包含声明)。

因此,为了实际调用实现,目标代码(即编译的源代码)也必须存在于可执行文件中。但是,此代码包含在外部库(在您的情况下为libglfw.a)中。因此,通过添加-lglfw选项,可以将库中包含的对象代码添加到可执行文件中,从而确保您从代码中调用的代码最终会进入库代码。

底线: * .h文件 - &gt;仅声明,没有实施

* .cpp,*。o,.a(.lib),. so(。dll,.dynlib) - &gt;目标代码,实现