如何编译我的C源文件而无需在其中放置main
函数?
我收到了没有main函数的.c
文件的错误,并且不想只为编译添加main函数。
答案 0 :(得分:36)
在GCC上,-c
开关就是你想要的。
-c
表示“编译,不链接”,并且您获得name.o
输出文件。
答案 1 :(得分:9)
使用编译器的-c
选项(适用于GCC,选项可能与其他c编译器相同)。
来自GCC的手册页:
当您调用GCC时,通常会这样做 预处理,编译,汇编 和链接。 “整体选择” 允许你停止这个过程 中间阶段。例如, -c选项表示不运行链接器。然后输出由对象组成 汇编程序输出的文件。
链接阶段是查找main()
的步骤,如果找不到则会抱怨。
答案 2 :(得分:9)
假设你有hello.c:
#include<stdio.h>
#include<stdlib.h>
_start()
{
exit(my_main());
}
int my_main()
{
printf("Hello");
return 0;
}
编译为:
gcc -nostartfiles hello.c
你可以从中获得一个可执行文件。
答案 3 :(得分:3)
你可以在没有main
的情况下编译单个文件,但你不能链接它们当然不能运行它们是因为它们是不完整的程序。请注意,valgrind不是静态分析工具,而是运行时工具,因此对未链接到可运行程序的单个翻译单元没用。
如果要测试单个文件,通常的做法是在每个文件中包含以下内容:
#ifdef UNIT_TEST
int main(int argc, char **argv)
{
/* unit test code goes here */
}
#endif
使用-DUNIT_TEST
编译文件。
答案 4 :(得分:0)
如果要编译而不链接,则以上答案是正确的,请使用-c
开关。如果需要“独立”可执行文件,请使用-entry:function
开关。默认或“托管环境”可执行文件的入口点为-entry:mainCRTStartup
,它调用main
。请注意,如果您要制作freestanding
可执行文件,则不能使用freestanding
库<float.h>
,<iso646.h>
,<limits.h>
,{{1} },<stdalign.h>
,<stdarg.h>
,<stdbool.h>
,<stddef.h>
和<stdint.h>
。
何时编写<stdnoreturn.h>
可执行文件? freestanding
和Kernels
。如果您爱好Drivers
,则需要编写它们。如果您为硬件制造商(例如图形卡制造商)工作,则需要为其编写驱动程序。
有些使用嵌入式单元测试,而另一些使用条件编译将它们写为单独的文件。请记住,os-dev
和#define
命令有一定程度的重叠。
答案 5 :(得分:0)
要在 gcc 中不使用 main() 进行链接,请为“条目”选择一个函数来代替 main()。 链接时,添加此选项:
-e 条目
--entry=entry