如何覆盖系统c库头?

时间:2016-04-28 19:26:29

标签: c posix libc

我正在研究C中的嵌入式项目。我们的供应商提供的工具链包括一个缺少某些POSIX标准功能的有限C库。例如,他们有一个time.h但是省略了一些POSIX功能。我想在我的项目中包含一些使用#include <time.h>的源代码的C库,并期望这些函数存在。有没有办法让这些库得到编译而不必修改它们的源代码,或者除了用附加函数创建另一个名为time_suppl.h的标题之外别无选择,并编辑所有库源文件以包含它们包括time.h

2 个答案:

答案 0 :(得分:2)

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

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

将目录dir添加到要搜索的目录列表中   头文件。请参阅搜索路径。搜索由-I命名的目录   在标准系统包括目录之前。

  • 对于专有的ARMCC编译器,有一个-J选项,允许您完全覆盖系统头搜索路径,这将更深入地描述in their documentation

答案 1 :(得分:0)

除了@ satur9nine的回答之外,这是更多的补充,但您可以在不复制整个time.h的情况下执行此操作。如果您正在使用GCC,则可以使用#include_next预处理程序指令来包含&#34; next&#34;搜索路径中的文件实例。请看以下示例:

在/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。