我知道如何在裸机嵌入式应用程序中使用 GCC 编译 C 应用程序,而无需链接任何库,只需设置启动函数并最终设置程序集startup.s 文件。
相反,我无法在 Windows 中执行相同的操作(我使用的是 MINGW32 GCC)。似乎与 -nostdlib 的链接也删除了 main 之前需要执行的所有内容,所以我应该编写一个特定的启动项,但我没有找到任何关于此的文档。
我需要在没有 C std lib 的情况下进行编译的原因是我正在为小型 32 位微控制器编写一个精简的 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 交叉编译器工作。
如何在 linux (gcc/debian) 中编译 C 程序而无需链接的简单答案是使用命令“gcc -c $CFILE”
如果你不明白,请执行这个脚本
#!/usr/bin/bash gcc -c $CFILE
然后将 $CFILE 导出到您的 c 文件名 示例导出