【问题标题】:What libc and can I omit it's includes in my project?什么 libc,我可以省略它包含在我的项目中吗?
【发布时间】:2016-01-09 13:52:16
【问题描述】:

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

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。它是一些标准的二进制对象和头文件集吗?

【问题讨论】:

标签: c gcc


【解决方案1】:

看起来 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.so.6 是别的。请仔细阅读。标头仅提供常量、函数原型和结构定义。
  • @FUZxxl 你能解释一下为什么吗?如果您是专家,那没关系,假设您故意做了一些会触发警告的事情。如果你不是专家,那有什么问题呢?它会突出一些你不知道是错误的错误吗?
  • 因为愚蠢的建议有很多原因,这里列出的时间太长了。
  • @FUZxxl 我只需要一个,而不是整个列表。而stupid是一个强词,所以请用标准来支持它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-13
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
相关资源
最近更新 更多