libc是什么,我可以在项目中包含它吗?

时间:2016-01-09 13:52:17

标签: c gcc

我有一个没有包含的简单程序可以编译一些警告:

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

编译:

gcc hello.c

Warning:
In function ‘main’:
warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default]
     printf("hello");
     ^
warning: incompatible implicit declaration of built-in function ‘exit’ [enabled by default]
     exit( 0 );
     ^

编译命令非常简单,不包含有关包含printfexit的包含库文件的信息。如果我错了,请纠正我,但看起来gcc默认将我的项目链接到这些库。这让我想到不需要包含libc库的文件吗?

再次纠正我。我得到警告,因为GCC以某种方式知道libc的一些基本功能,这些功能有不同的参数。但是,由于GCC检查了所有libc,它无论如何都发现了正确的功能。

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

1 个答案:

答案 0 :(得分:3)

  

看起来gcc默认将我的项目链接到这些库。这让我想到不需要包含libc库的文件吗?

  • 包含和链接与此无关。这些包含函数原型,用于指示编译器有关返回值类型和给定函数的参数。当函数调用发生时,并且没有原型,但编译器假定它返回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