编译尝试将crt1.o /'start'/未定义的引用提供给'main'/退出状态消息

use*_*070 1 c

我正在写一本书:C语言中的TCP / IP套接字及其网站代码。

我正在尝试基于这些文件构建客户端和服务器。我的make给出了很多错误,这些错误与无法从DieWithMessage.c中找到函数有关

这里是:

  #include <stdio.h>
  #include <stdlib.h>
  #include "Practical.h"

void DieWithUserMessage(const char *msg, const char *detail) {
  fputs(msg, stderr);
  fputs(": ", stderr);
  fputs(detail, stderr);
  fputc('\n', stderr);
  exit(1);
} 

void DieWithSystemMessage(const char *msg) {
  perror(msg);
  exit(1);
}
Run Code Online (Sandbox Code Playgroud)

当我执行gcc DieWithMessage.c时,出现以下错误:

/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5.2/../../../crt1.o:在函数_start': (.text+0x18): undefined reference tomain'collect2中:ld返回1退出状态

我如何单独编译它,以便在使用makefile时不再发生错误?

谢谢你的帮助。

pax*_*blo 5

main如果您要尝试链接/运行它,那么您的C代码需要一个函数。这是标准下托管C应用程序的要求。

该错误消息表明出了什么问题。C运行时/启动代码(CRT)的入口点start用于设置环境,然后调用main。由于您没有提供一个main,它抱怨。

如果您只想生成一个目标文件以用于以后与链接main(请参阅此处以获取该过程的描述),请使用类似以下内容的文件:

gcc -c -o DieWithMessage.o DieWithMessage.c
Run Code Online (Sandbox Code Playgroud)

-c是“编译但不链接”标志)。然后,您可以使用类似(尽管还有其他选项)的方式将其与主程序链接:

gcc -o myProg myProg.c DieWithMessage.o
Run Code Online (Sandbox Code Playgroud)

如果您希望以后使用真实的占位符 main进行更新,可以在代码中添加以下内容:

int main (void) { return 0; }
Run Code Online (Sandbox Code Playgroud)