我在* .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
?
答案 0 :(得分:6)
GL / glfw.h是一个头文件,它声明所有的类型,常量,函数,你知道钻取,它是让编译器知道要生成什么代码并使它不是抱怨未知标识符。 libglfw是一个包含实际二进制代码的库(或稍后将由动态链接器绑定的存根,或类似的东西),你必须与它链接以使链接器不抱怨未解决符号。
标头可能包含库的实际源代码(因此编译器将为使用库的每个翻译单元反复生成二进制代码),它被称为然后是一个只有头文件库,但在C世界中,这些库不是你经常可以找到的东西,而且这个特定的库不是只有头文件。
答案 1 :(得分:1)
我不知道具体的GLFW库。但是,#include
是编译器的预处理程序指令(如果您错过了,您的代码将无法编译),但-lglfw
参数适用于链接器(如果您错过了,代码将被编译为目标文件,但您将通过链接器获得未定义的符号。)
有些(稀有)库只是标题内容;它们完全在#include
- d标题中提供功能。我只知道一个这样的库(GNU闪电)。
大多数库作为共享或静态库文件(即lib*.so
或lib*.a
文件)存在。它们提供的功能是已编译的代码,您需要将其链接到可执行文件中。
详细了解linkers
答案 2 :(得分:1)
好吧,头文件(带有.h)只包含say函数,变量类等的声明。因此,通过在.c文件中包含头文件,可以使编译器知道函数等的声明。这意味着,编译器能够生成实际调用函数的命令。
然而,函数的定义(即实际实现)是完全不同的东西,它(通常)不存在于头文件中(仅包含声明)。
因此,为了实际调用实现,目标代码(即编译的源代码)也必须存在于可执行文件中。但是,此代码包含在外部库(在您的情况下为libglfw.a)中。因此,通过添加-lglfw选项,可以将库中包含的对象代码添加到可执行文件中,从而确保您从代码中调用的代码最终会进入库代码。
底线: * .h文件 - &gt;仅声明,没有实施
* .cpp,*。o,.a(.lib),. so(。dll,.dynlib) - &gt;目标代码,实现