到目前为止我见过的所有 C 语言软件都广泛使用了所谓的“C 标准库”,这是一个软件的一部分(或者实际上是) C 标准本身。所以,无论版主怎么想,这都不是一本书,也不是一个商业软件。
相反,它是包含类似 malloc()
之类的实现的基本软件库。 , printf()
和strcpy()
通常与所有系统捆绑在一起。
现在,我需要用 C 语言编写一些软件而不使用该库,因为它在该环境中既不可用也不可行。 但我仍然需要读写文件和套接字。
对类似问题或环境有任何想法或指示吗?
最佳答案
Stricto sensu,一个不使用标准库的可移植(托管)C99 程序甚至无法进行任何输入/输出,或者可能产生任何可观察到的副作用。您甚至无法在堆中分配任何数据(就像malloc
那样)。顺便说一句,任何 C99 托管实现都需要 libc;您想要一个独立的 C 库(根据定义,它是“特定于实现的”;实际上,它可以以特定于实现的方式使用特定于操作系统的服务。另请参阅 this)。
在旧版 Linux(以及 IIRC、SVR4,例如 SunOS 5)上,曾经有一些 libsys
仅与 syscalls(2) 接口(interface)。 。 AFAIK,它已被弃用,我找不到它。
一些库(例如 GTK 的 Glib,...)提供了大多数标准 C 库函数的等效功能(但它们需要一些 libc,即托管 POSIX 系统)。
请注意,您可能会考虑使用 musl-libc也许可以从中删除您不需要的功能。您还可以考虑使用一些提供标准子集的 libc,例如dietlibc 。另请参阅维基页面 C standard library .
顺便说一句,您在使用 C 语言编写任何不使用 libc 的用户态 Linux 应用程序时可能会遇到问题(例如,因为 crt0 )。
奇怪的是,我今天甚至无法命名一种不使用 C 的自由软件语言。原则上这是可能的(例如在 Linux 上编译为仅调用系统调用),但我不知道类似的东西那个。
但是请注意(至少在 Linux 上),如果您编写一个静态链接的二进制文件,而该二进制文件不调用任何标准 C 函数,则该二进制文件将仅启动 libc 的一小部分(可访问的部分)来自 crt0)。
一些标准库设施(如 setjmp(3) 或 stdarg(3) ...)通常需要 - 或者至少受益于 - 一些编译器魔法(甚至 malloc
、printf
,免费
使用最近的 GCC )。一些标准库函数无法在可移植 C 中实现。
如果使用 gcc
,请不要忘记在这种情况下 gcc
的 -ffreestand
选项。请参阅this .
引用n1570 ,一项(草案)C11 标准,几乎与 ISO 标准类似,或与 n2573 类似。 ,接近C20标准。另请参阅Modern C还有这个C reference website 。独立开源应用程序的示例包括 Linux kernel ,但是github上还有很多其他的或gitlab并在 OSDEV 上提到,也适用于 Arduino或RaspberryPi 。我建议下载他们的源代码并研究它以获取灵感。
注意:您可以认为 C99 语言有两种方言:托管 C,其中包含标准 libc 函数,例如 fprintf
、malloc
等。 .. 并以 main
开头...以及不包含它们的独立 C(但包含 setjmp
等...)并且没有启动约定。
关于没有 C 标准库的 C 程序。如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26591647/