在使用nostdlib和nostdinc标志进行编译时,如何使用stdio和stdlib?

时间:2015-06-11 20:04:24

标签: c linux makefile

我编写了一个Makefile,它将我的mini-os编译成另一个应用程序。 我必须使用-nostdioc-nostdlib来编译它们,但问题是,该应用程序正在使用stdio / stdlib函数,当我运行我的Makefile时,我得到的错误消息是我的应用程序使用的函数无法找到。

我尝试删除-nostdlib -nostdioc,但这不起作用。

Here is the Makefile如果有人想看一看。

1 个答案:

答案 0 :(得分:3)

-nostdlib告诉gcc不要包含告诉编译器不要包含标准库,其中一个是glibc(GNU libc)。 -nostdinc告诉编译器不要使用头文件的标准路径。 stdlib.h和stdio.h中的原型函数是libc的一部分,你告诉gcc不要使用它。因此,您需要自己实现它们或明确包含libc(用于自定义操作系统的一些常见的是newlib和uClibc)。哪种方法更容易取决于所使用的功能。我应该补充一点,如果您正在尝试编译操作系统和应用程序,甚至是静态应用程序,您可能需要考虑使用交叉编译器(http://wiki.osdev.org/GCC_Cross-Compiler)并且如果可以使其工作下一步是您自己的工具链,其中包括libc(http://wiki.osdev.org/OS_Specific_Toolchain)。

如果实现必要的功能不是一个选项,那么最好的办法就是使用一个完整的工具链,包括你自己的libc。您不能简单地使用GNU libc作为libc是系统调用的包装器的一部分,并且您必须拥有一个具有与主机操作系统相同的系统调用接口的内核。请注意,将libc移植到操作系统的部分过程是实现系统调用。对于newlib,这包括但不限于write,read,open,close,fork和exec。如果您的应用程序不使用这些系统调用,则可以简单地实现虚拟版本。

相关问题