【发布时间】:2011-04-23 12:59:48
【问题描述】:
如何编译我的 C 源文件而不需要在其中添加 main 函数?
.cfiles 没有主函数并且不想为了编译而添加主函数。
【问题讨论】:
-
对于 MSVC(Visual Studio,
cl),请参阅 stackoverflow.com/questions/2727187/…。
标签: c
如何编译我的 C 源文件而不需要在其中添加 main 函数?
.cfiles 没有主函数并且不想为了编译而添加主函数。
【问题讨论】:
cl),请参阅 stackoverflow.com/questions/2727187/…。
标签: c
在 GCC 上,-c 开关就是您想要的。
-c 表示“编译,不要链接”,你会得到一个name.o 输出文件。
【讨论】:
-c 是大多数 C 编译器的标准。
假设你有 hello.c:
#include<stdio.h>
#include<stdlib.h>
_start()
{
exit(my_main());
}
int my_main()
{
printf("Hello");
return 0;
}
编译为:
gcc -nostartfiles hello.c
你可以从中得到一个可执行文件。
【讨论】:
使用编译器的-c 选项(适用于 GCC,其他 c 编译器的选项可能相同)。
来自 GCC 的手册页:
当你调用 GCC 时,它通常会 预处理、编译、组装 和链接。 “整体选项” 允许您停止此过程 中间阶段。例如, -c 选项表示不运行链接器。然后输出由对象组成 汇编器输出的文件。
链接阶段是查找main() 并在找不到时进行投诉的步骤。
【讨论】:
你可以在没有main 的情况下编译单个文件,但你不能链接它们,当然也不能运行它们,因为它们不完整程式。请注意,valgrind 不是静态分析工具,而是运行时工具,因此它对未链接到可运行程序的单个翻译单元毫无用处。
如果您想测试单个文件,通常的做法是在每个文件中包含以下内容:
#ifdef UNIT_TEST
int main(int argc, char **argv)
{
/* unit test code goes here */
}
#endif
并使用-DUNIT_TEST编译文件。
【讨论】:
-D 是预定义预处理器宏的命令行选项。
如果你想编译不链接,上面的答案都是正确的,使用-c开关。如果您想要一个“独立的”可执行文件,请使用-entry:function 开关。默认或“托管环境”可执行文件的入口点为-entry:mainCRTStartup,它调用main。请注意,如果您正在制作freestanding 可执行文件,则不能使用freestanding 库<float.h>、<iso646.h>、<limits.h>、<stdalign.h>、<stdarg.h>、<stdbool.h>、@987654333 之外的标准库@、<stdint.h> 和 <stdnoreturn.h>。
freestanding 可执行文件何时编写? Kernels 和 Drivers。如果您喜欢os-dev,那么您需要编写它们。如果您为硬件制造商工作,例如显卡制造商,则需要为他们编写驱动程序。
一些使用嵌入式单元测试,而另一些则使用条件编译将它们编写为单独的文件。请记住,#define 和 makefile 命令有一定程度的重叠。
【讨论】:
要在 gcc 中不使用 main() 进行链接,请为“条目”选择一个函数来代替 main()。 链接时,添加此选项:
-e 条目
--entry=entry
【讨论】: