GCC:编译应用程序而不链接任何库

问题描述 投票:0回答:2

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

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

我需要在没有 C std lib 的情况下进行编译的原因是我正在为小型 32 位微控制器编写一个精简的 C std lib,并且我想在 Windows 下使用 GCC 来测试和单元测试这个库。所以,如果有一种替代的最简单的方法对我来说就可以了。

谢谢。

c windows gcc libc
2个回答
1
投票

我找到了将 -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 交叉编译器工作。


0
投票

如何在 linux (gcc/debian) 中编译 C 程序而无需链接的简单答案是使用命令“gcc -c $CFILE

如果你不明白,请执行这个脚本

#!/usr/bin/bash gcc -c $CFILE

然后将 $CFILE 导出到您的 c 文件名 示例导出

© www.soinside.com 2019 - 2024. All rights reserved.