如何在没有main函数的情况下编译C源代码?

时间:2011-04-23 12:59:49

标签: c

如何编译我的C源文件而无需在其中放置main函数?

我收到了没有main函数的.c文件的错误,并且不想只为编译添加main函数。

6 个答案:

答案 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>可执行文件? freestandingKernels。如果您爱好Drivers,则需要编写它们。如果您为硬件制造商(例如图形卡制造商)工作,则需要为其编写驱动程序。

有些使用嵌入式单元测试,而另一些使用条件编译将它们写为单独的文件。请记住,os-dev#define命令有一定程度的重叠。

答案 5 :(得分:0)

要在 gcc 中不使用 main() 进行链接,请为“条目”选择一个函数来代替 main()。 链接时,添加此选项:

-e 条目

--entry=entry