c - GCC:在不链接任何库的情况下编译应用程序

标签 c windows gcc libc

我知道如何在裸机嵌入式应用程序中使用 GCC 编译 C 应用程序而不链接任何库,只需设置启动函数并最终设置程序集 startup.s 文件。

相反,我无法在 Windows 中执行相同的操作(我使用的是 MINGW32 GCC)。似乎与 -nostdlib 的链接也删除了在 main 之前需要执行的所有内容,所以我应该编写一个特定的启动但我没有找到任何关于它的文档。

因为我需要在没有 C std lib 的情况下进行编译,原因是我正在为小型 32 位微 Controller 编写一个 rduced C std lib,我想在 Windows 下使用 GCC 测试和单元测试这个库。所以,如果有其他最简单的方法对我来说没问题。

谢谢。

最佳答案

我找到了将 -nostdlib 和 -lgcc 一起添加到 ld(或用作链接器的 gcc)的解决方案。通过这种方式,C 标准库不会自动链接到应用程序,但启动应用程序所需的一切都已链接。

我还发现这些开关的顺序很重要,它可能根本不工作,信号丢失 at_exit() 函数或工作时没有任何错误/警告,具体取决于选项的顺序和位置。

我在使用基于 Eclipse 的 IDE 时发现了另一个小问题,因为在“设置”菜单中有一些不同的方法,所以为了以正确的顺序编写选项,我需要在不同的地方设置它们。

之后我遇到了一个新问题:我不认为单元测试库至少需要一个能够写入标准输出或文件的函数。

我发现使用 ""和 <> 会强制编译器和链接器使用我的库和 C 标准库所需的库模块。

例如:

#include "string.h" // points to my library include
#include <stdio.h>  // points to C stdlib include

允许我使用 C stdlib stdout 函数测试我所有的库字符串函数。 它可以同时使用 GCC 和 GCC 交叉编译器。

关于c - GCC:在不链接任何库的情况下编译应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48256146/

相关文章:

c++ - C++ 构造函数中的损坏

c - 用 gcc 生成 BZHI 指令

c++ - #pragma pack(show) 与 GCC

c - atmel代码错误?

node.js - 如何在 Windows 上安装 MediaWiki Parsoid

c#托管和非托管代码之间的共享内存

c++ - 以前版本的文件在 SMB 客户端中不可见

c - C解释中的 float 下溢

C:通过指针连接字符串

c - 使用 gcc 库将 long 类型转换为 float