【问题标题】:Compiling a C program without Main [duplicate]在没有 Main 的情况下编译 C 程序 [重复]
【发布时间】:2016-04-17 18:51:04
【问题描述】:

我必须制作一个简单的 C 程序(不能使用 main 函数)。

这样:

test.c

#include <stdio.h>

int getUserID(int id);

int getUserID(int id) {
    return 0;
}

到目前为止,我当前的函数什么都不做: 但是,我正在尝试通过 makefile 编译它,例如:

all:
    gcc test.c 

这不起作用,因为我没有 main,所以我在其中添加了 -c 命令。

all:
    gcc -c test.c

现在用 make 编译,但给了我一个目标文件(但没有一个工作的可执行文件),当我尝试运行它时得到的可执行文件:i.e ./test tells me permission denied

任何帮助将不胜感激。

【问题讨论】:

  • @CollinD 他已经试过了。
  • @BaummitAugen 这并没有改变这个问题已经被问到的事实。还有一个很好的解释,为什么他不能做他所要求的,还有一些他实际上没有尝试过的其他建议。
  • 为什么不能有main函数?
  • “这并不能改变这个问题已经被问到的事实。” 这是不正确的。骗子想要编译没有main 的源文件,这是可能的,没有什么不寻常的,而OP 想要一个没有main 的程序,这至少很狡猾。
  • 为什么要一个没有main 函数的C 程序?这有点像要一个没有蛋筒的冰淇淋蛋筒。

标签: c++ c makefile


【解决方案1】:

如果没有main,你就不能拥有一个 C++ 或 C 程序(至少没有邪恶的、非标准的 hack)。您可以构建没有 main 的库,但不能构建独立的可执行文件。

对于独立应用程序,main 函数至关重要,因为它定义了从哪里开始执行。

【讨论】:

    【解决方案2】:

    你可以把这个c文件单独编译成一个object文件,但是它需要和另一个包含main函数的object文件链接起来才能成为一个可执行程序。

    如果你不允许在这个文件中有一个主函数,那么你必须有另一个文件要链接到它。

    【讨论】:

      【解决方案3】:

      可以创建一个“main”不是入口点的图像。

      这是一种这样的方式(在 RHEL6 系统上使用 gcc):

      $ cat sample.c
      #include <stdio.h>
      #include <unistd.h>
      
      int notmain ( void ) {
              printf("hello, world\n");
              exit(0);
      }
      $ cc -ffreestanding -c sample.c
      $ ld -enotmain -o sample sample.o -I/lib64/ld-linux-x86-64.so.2 -lc
      $ ./sample
      hello, world
      

      而且,顺便说一句,这不是“邪恶的、非标准的 hack”——C 标准定义了 two execution environments:(1)“托管”,这是大多数人的熟悉,以及 (2) “独立式”,通常是某种嵌入式系统(烤面包机或诸如此类)。

      【讨论】:

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