[英]How to compile C source code without a main function?
如何编译我的 C 源文件而不需要在其中放置main
函数?
对于没有 main 函数并且不想添加 main 函数只是为了编译的.c
文件,我收到一个错误。
在 GCC 上, -c
开关就是你想要的。
-c
意思是“编译,不链接”,你会得到一个name.o
输出文件。
假设你有 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
编译文件。
如果你想在不链接的情况下编译,上面的答案是正确的,使用-c
开关。 如果您想要一个“独立的”可执行文件,请使用-entry:function
开关。 默认或“托管环境”可执行文件的入口点为-entry:mainCRTStartup
,它调用main
。 请注意,如果您正在制作freestanding
可执行文件,则不能使用freestanding
库之外的标准库<float.h>
、 <iso646.h>
、 <limits.h>
、 <stdalign.h>
、 <stdarg.h>
、 <stdbool.h>
、 <stddef.h>
、 <stdint.h>
和<stdnoreturn.h>
。
什么时候编写freestanding
可执行文件? Kernels
和Drivers
。 如果您对os-dev
,那么您需要编写它们。 如果您为硬件制造商(例如显卡制造商)工作,则需要为他们编写驱动程序。
一些使用嵌入式单元测试,而另一些使用条件编译将它们编写为单独的文件。 请记住,# #define
和makefile
命令有一定程度的重叠。
要在 gcc 中不使用 main() 进行链接,请为“条目”选择一个函数来代替 main()。 链接时,添加此选项:
-e 条目
--entry=入口
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.