【问题标题】:How can I use stdio and stdlib while compiling with nostdlib and nostdinc flags?如何在使用 nostdlib 和 nostdinc 标志进行编译时使用 stdio 和 stdlib?
【发布时间】:2015-06-11 20:04:23
【问题描述】:

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

我试图删除 -nostdlib -nostdioc 但没有奏效。

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

【问题讨论】:

    标签: c linux makefile


    【解决方案1】:

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

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

    【讨论】:

    • 感谢回答。但问题是应用程序库中定义了很多东西,我不能用其他东西替换它们。我没有其他方法可以编译它们吗?
    • @esm - 很好的建议。听起来代码依赖于标准库(对于代码库来说这是完全合理的事情!),如果标准 GLibc 不兼容项目要求,则有很多不错的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多