什么是libc,我可以在我的项目中省略它吗?

什么是libc,我可以在我的项目中省略它吗?,c,gcc,C,Gcc,我有一个没有包含的简单程序,它编译时带有一些警告: int main(int argc, char **argv) { printf("hello"); exit(0); } 汇编: 你好 警告: 在函数“main”中: 警告:内置函数“printf”的不兼容隐式声明[默认启用] printfhello; ^ 警告:内置函数“exit”的不兼容隐式声明[默认情况下已启用] 出口0; ^ 编译命令非常简单,不包含有关包含printf和exit的include库文件的信息。如果我

我有一个没有包含的简单程序,它编译时带有一些警告:

int main(int argc, char **argv)
{
    printf("hello");
    exit(0);
}
汇编:

你好 警告: 在函数“main”中: 警告:内置函数“printf”的不兼容隐式声明[默认启用] printfhello; ^ 警告:内置函数“exit”的不兼容隐式声明[默认情况下已启用] 出口0; ^ 编译命令非常简单,不包含有关包含printf和exit的include库文件的信息。如果我错了,请纠正我,但gcc默认情况下会将我的项目链接到这些库。这让我想到,不需要包含libc库的文件

请再说一遍。我收到了警告,因为GCC知道libc的一些基本函数,这些函数有不同的参数。但由于GCC检查所有libc,它无论如何都会找到正确的函数

什么是libc。它是一组标准的二进制对象和头文件吗

默认情况下,gcc将我的项目链接到这些库。这让我想到,不需要包含libc库的文件

包含和链接不是这样关联的。include包含函数原型,用于向编译器指示给定函数的返回值类型和参数。当函数调用发生,并且没有原型时,编译器会假定它返回int,这可能导致未定义的行为

程序将链接到标准库,函数定义将可用,但由于程序是在假设这些函数都返回int的情况下编译的,因此可能会出现与此相关的运行时错误,因为行为未定义,因此无法预测

我收到了警告,因为GCC知道libc的一些基本函数,这些函数有不同的参数。但由于GCC检查所有libc,它无论如何都会找到正确的函数

不,这与gcc不知道任何事情无关,相反,它与gcc不知道如何调用这些函数有关。 什么是libc。它是一组标准的二进制对象和头文件吗

libc在当前的glibc中是一个二进制文件libc.so.6,它是一个运行库,包含标准程序所需的所有符号,它不包括math.h函数,例如libm.so.6

出于上述原因,您的程序中仍然需要头文件,或者至少需要声明您使用的标准函数。这些声明称为原型,编译器需要这些声明才能正确编译代码

注意:始终使用至少-Wall-Werror进行编译,如下所示

gcc-Wall-Werror hello.c
可能重复的请忽略关于始终使用-Werror的建议。否:头是一些东西,libc。所以。6是其他东西。请仔细阅读。标题仅提供常量、函数原型和结构定义。@FUZxxl您能解释一下原因吗?如果你是一名专家,那没关系,假设你故意做了一些会触发警告的事情。如果你不是专家,有什么问题?它会突出一些你不知道是错误的错误?因为它是愚蠢的建议,因为有很多原因,在这里列出太长。@fuzzxl我只需要一个,而不是整个列表。愚蠢是一个强有力的词,所以请用标准来支持它。