【问题标题】:How to compile with c11 standard library on OS X with clang?如何使用clang在OS X上使用c11标准库编译?
【发布时间】:2023-04-01 04:56:01
【问题描述】:

嘿,我正在尝试用 clang 编译使用 OS X 上 c11 标准库中的函数的 c 代码。

编译器选项-std=c11 允许我使用c11 语言功能。但是当我使用像at_quick_exit 这样的新功能时,我收到以下警告implicit declaration of function 'at_quick_exit' is invalid in C99

源码有下面这行#include <stdlib.h> clang 选项-stdlib 没有帮助。

我的系统:

OS X 优胜美地 10.10.3

$ clang -v
Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
Target: x86_64-apple-darwin14.3.0
Thread model: posix

Ubuntu 14.04 LTS

$ clang -v
Ubuntu clang version 3.4-1ubuntu3 (tags/RELEASE_34/final) (based on LLVM 3.4)
Target: x86_64-pc-linux-gnu 
Thread model: posix

更明确地说。如何在 OS X 上安装 c11 标准库?

感谢您的任何帮助。

【问题讨论】:

  • 调用 at_quick_exit 函数的源代码是否也有这行:#include ?
  • 其他 stackoverflow 问题的答案表明 'quick_exit()' 未在 OSX 中实现。我的系统 ubuntu 14.04 没有“quick_exit()”和“at_quick_exit()”!这两个都是系统级功能。建议使用 'exit()' 和 'atexit()' 来实现相同的功能。

标签: c macos clang libc c11


【解决方案1】:

通常,单独的自托管系统编译器不能提供完整的标准 C 环境,包括运行时库。通常,底层系统提供大部分(如果不是全部)库(和头文件),而编译器只进行编译。

因此,如果您需要某些特定系统未提供的特定功能,那么您将不得不自己编写它们,或者从与您的目标系统兼容的一些可移植库中获取它们。

在这种特殊情况下,您可能还会发现quick_exit() 本身不是由系统的libc 提供的,因此您自己编写这两个函数应该很容易。

【讨论】:

  • 如果 foo 是一个标准化函数的名称,那么编写自己的函数名为 foo 是未定义的行为,因此我建议不要使用标准名称调用这两个函数。跨度>
  • 这是一个似是而非的论点。标准中没有什么魔法会导致任何现实世界的问题——如果它有效,它就有效,如果它使代码与未来环境兼容,那就更好了。当然,理想情况下,替换将在一个单独的编译单元中,并且只有在目标还没有“标准”实现时才会由构建系统选择。
猜你喜欢
  • 2014-03-21
  • 2020-01-14
  • 2017-09-27
  • 1970-01-01
  • 2013-09-25
  • 2011-03-21
  • 1970-01-01
  • 2011-03-05
  • 2019-10-01
相关资源
最近更新 更多