我知道这已经被问过了,但是我似乎找不到我需要的答案。编译器似乎可以与其他代码一起正常工作,因此我相信问题出在代码中。 我正在使用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
答案 0 :(得分:0)
我相信您正在尝试构建目标文件。
gcc
在默认情况下被调用时,将尝试构建可执行文件。如果在您指定要编译和链接的文件之一中找不到main
函数,它就不会这样做。
要仅生成目标文件,请在编译代码时将-c
标志传递给gcc
。
gcc -o "progressWarmUp" -c ./main.o
这将告诉gcc
在编译过程之后和链接过程之前停止。
请注意,如果您实际上要自己执行此代码,则必须通过将其与具有定义的main
函数的“文件”“配对”,将其链接到可执行文件。