首页 > 解决方案 > c - 在函数“_start”中:(.text+0x20):未定义对“main”的引用

问题描述

我知道以前有人问过这个问题,但我似乎找不到我需要的答案。编译器似乎可以与其他代码一起正常工作,所以我相信问题出在代码中。我正在使用eclipse,首先我认为这可能是一个配置错误,但是当我在命令行中尝试时,它是同样的错误。

如果你看看我真的很感激。谢谢!

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


#ifndef min
  #define min(x,y) (((x) < (y)) ? (x) : (y))
#endif

#define MAX_PROG_STEP_SIZE 10
#define MAX_COLS 80

static int init = 0;

#ifdef _WIN32

#include <windows.h>

void init_io(void) {
  system("cls");
  srand(time(NULL));
  init = 1;
}

CHAR GetCh(VOID) {
  HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
  INPUT_RECORD irInputRecord;
  DWORD dwEventsRead;
  CHAR cChar;

  while(ReadConsoleInputA(hStdin, &irInputRecord, 1, &dwEventsRead)) /* Read key press */
    if (irInputRecord.EventType == KEY_EVENT) {
      cChar = irInputRecord.Event.KeyEvent.uChar.AsciiChar;
      ReadConsoleInputA(hStdin, &irInputRecord , 1, &dwEventsRead); /* Read key release */
      return cChar;
    }
  return EOF;
}

void shutdown_io(void) {
  // NOP
}

#else

#include <unistd.h>
#include <termios.h>
#define GetCh getchar

static struct termios old_termios_settings;

void init_io(void) {
  struct termios new_termios_settings;

  tcgetattr(0, &old_termios_settings);
  new_termios_settings = old_termios_settings;

  /* Disable canonical mode and echoing, and set buffer size to 1 byte */
  new_termios_settings.c_lflag &= (~ICANON & ~ECHO);
  new_termios_settings.c_cc[VTIME] = 0;
  new_termios_settings.c_cc[VMIN] = 1;

  tcsetattr(0, TCSANOW, &new_termios_settings);

  setvbuf(stdin, NULL, _IONBF, 0);
  system("clear");
  srand(time(NULL));
  init = 1;
}

void shutdown_io(void) {
  tcsetattr(0, TCSANOW, &old_termios_settings);
}

#endif

unsigned int get_progress(void) {
  static unsigned int progs = 0;
  unsigned int rand_val;
  unsigned int i;
  if (progs == 0xFFFFFFFF)
    return progs;

  rand_val = rand() % MAX_PROG_STEP_SIZE;
  i = rand() % 4;
  while (((progs >> (i * 8)) & 0xFF) == 0xFF) {
    i = (i + 1) % 4;
  }
  if (((progs >> (i * 8)) & 0xFF) + rand_val < 0xFF)
    progs += rand_val << (i * 8);
  else
    progs |= 0xFF << (i * 8);
  return progs;
}

void progressbar(char done_symbol, char active_symbol, char todo_symbol, unsigned int percent) {
  unsigned int w = MAX_COLS - 2;
  unsigned int limit = percent*w/100;
  unsigned int i;

  if (init == 0)
    exit(42);

  printf("\r[");
  for (i = 0; i < w; i++) {
    putchar(i < limit ? done_symbol : (i == limit ? active_symbol : todo_symbol));
  }
  printf("]\r");
  fflush(stdout);
}

void wait_key(void) {
  if (init == 0)
    exit(42);
  (void)GetCh();
}

控制台输出是这样的:

make all 
Building target: progressWarmUp
Invoking: Cross GCC Linker
gcc  -o "progressWarmUp"  ./main.o   
/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
makefile:29: recipe for target 'progressWarmUp' failed
collect2: error: ld returned 1 exit status
make: *** [progressWarmUp] Error

1

标签: c

解决方案


我相信您正在尝试构建目标文件。

gcc,默认情况下调用时,将尝试构建可执行文件。main如果在您指定要编译和链接的文件之一中找不到函数,它就不能这样做。

要仅构建目标文件,请在编译代码时将-c标志传递给。gcc

gcc -o "progressWarmUp" -c ./main.o

这将告诉gcc在编译过程之后和链接过程之前停止。请注意,如果您确实想自己执行此代码,则必须通过将其与具有已定义main函数的目标文件链接来将其链接到可执行文件中。


推荐阅读