【问题标题】:How to compile C source code without a main function?如何在没有 main 函数的情况下编译 C 源代码?
【发布时间】:2011-04-23 12:59:48
【问题描述】:

如何编译我的 C 源文件而不需要在其中添加 main 函数?

.cfiles 没有主函数并且不想为了编译而添加主函数。

【问题讨论】:

标签: c


【解决方案1】:

在 GCC 上,-c 开关就是您想要的。

-c 表示“编译,不要链接”,你会得到一个name.o 输出文件。

【讨论】:

  • 我认为-c 是大多数 C 编译器的标准。
【解决方案2】:

假设你有 hello.c:

#include<stdio.h>
#include<stdlib.h>
_start()
{
   exit(my_main());
}
int my_main()
{
   printf("Hello");
   return 0;
}

编译为:

gcc  -nostartfiles  hello.c 

你可以从中得到一个可执行文件。

【讨论】:

  • 你能添加引用吗
【解决方案3】:

使用编译器的-c 选项(适用于 GCC,其他 c 编译器的选项可能相同)。

来自 GCC 的手册页:

当你调用 GCC 时,它通常会 预处理、编译、组装 和链接。 “整体选项” 允许您停止此过程 中间阶段。例如, -c 选项表示不运行链接器。然后输出由对象组成 汇编器输出的文件。

链接阶段是查找main() 并在找不到时进行投诉的步骤。

【讨论】:

    【解决方案4】:

    你可以在没有main 的情况下编译单个文件,但你不能链接它们,当然也不能运行它们,因为它们不完整程式。请注意,valgrind 不是静态分析工具,而是运行时工具,因此它对未链接到可运行程序的单个翻译单元毫无用处。

    如果您想测试单个文件,通常的做法是在每个文件中包含以下内容:

    #ifdef UNIT_TEST
    int main(int argc, char **argv)
    {
        /* unit test code goes here */
    }
    #endif
    

    并使用-DUNIT_TEST编译文件。

    【讨论】:

    • -D 是预定义预处理器宏的命令行选项。
    • 这真的很普遍吗?我的意思是,比使用 cppunit 更常见?
    • 我不确定 valgrind 或测试与 OP 的问题有什么关系..
    【解决方案5】:

    如果你想编译不链接,上面的答案都是正确的,使用-c开关。如果您想要一个“独立的”可执行文件,请使用-entry:function 开关。默认或“托管环境”可执行文件的入口点为-entry:mainCRTStartup,它调用main。请注意,如果您正在制作freestanding 可执行文件,则不能使用freestanding 库&lt;float.h&gt;、&lt;iso646.h&gt;、&lt;limits.h&gt;、&lt;stdalign.h&gt;、&lt;stdarg.h&gt;、&lt;stdbool.h&gt;、@987654333 之外的标准库@、&lt;stdint.h&gt; 和 &lt;stdnoreturn.h&gt;。

    freestanding 可执行文件何时编写? Kernels 和 Drivers。如果您喜欢os-dev,那么您需要编写它们。如果您为硬件制造商工作,例如显卡制造商,则需要为他们编写驱动程序。

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

    【讨论】:

      【解决方案6】:

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

      -e 条目

      --entry=entry

      【讨论】:

        猜你喜欢
        • 2016-06-01
        • 2013-07-16
        • 2016-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多