如何覆盖系统c库头文件?

How to override system c library headers?

我正在使用 C 开发一个嵌入式项目。我们的供应商提供的工具链包括一个有限的 C 库,该库缺少一些 POSIX 标准函数。例如,他们有一个 time.h 但一些 POSIX 功能被遗漏了。我想在我的项目中包含一些来自源代码的 C 库,这些库使用 #include <time.h> 并期望这些函数存在。有没有办法让这些库编译而不必修改它们的源代码,或者别无选择,只能创建另一个可能名为 time_suppl.h 的头文件并带有附加功能,并编辑所有库源文件以在它们使用时包含它包括 time.h?

答案是这取决于您的编译器,但通常有一种方法可以在不修改您尝试编译的工具链或库的情况下完成。相反,您只需更改编译器使用的包含搜索路径。以下是如何操作的两个有用示例:

  • 对于 GCC 来说很简单,使用 -I 选项将添加到具有更高优先级的系统 header 的搜索路径中,因此它就像使用该参数指向一个位置一样简单与系统 header 完全相同的文件,例如 time.hgcc.gnu.org 的完整文档说:

Add the directory dir to the list of directories to be searched for header files. See Search Path. Directories named by -I are searched before the standard system include directories.

  • 对于专有的 ARMCC 编译器,有一个 -J 选项允许您完全覆盖系统 header 搜索路径,这在 in their documentation.[=22= 中有更深入的描述]

这是对@satur9nine 的回答的补充,但您可以在不复制整个 time.h 的情况下完成此操作。如果您使用的是 GCC,则可以使用 #include_next 预处理器指令在搜索路径中包含文件的 "next" 实例。举个例子:

在/home/me/test_include/time.h:

#include_next <time.h> // Will pull in the standard time.h
int myNewTimeFunction();

如果您随后使用 gcc -I/home/me/test_include 进行编译,那么当您 #include <time.h>.

时,您的新函数将有一个声明

这个 GCC 扩展 - YMMV 与其他编译器。