c-在函数_start中:(.text + 0x20):对main的未定义引用

时间:2018-09-07 09:19:12

标签: c

我知道这已经被问过了,但是我似乎找不到我需要的答案。编译器似乎可以与其他代码一起正常工作,因此我相信问题出在代码中。 我正在使用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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

这将告诉gcc在编译过程之后和链接过程之前停止。 请注意,如果您实际上要自己执行此代码,则必须通过将其与具有定义的main函数的“文件”“配对”,将其链接到可执行文件。