2015-01-15 2 views
-1

Я создал программу на C, и я попытался ее скомпилировать. Когда я использую свой компилятор gcc 4.8.1 в Widows, все работает и моя программа тоже.undefined ссылка на `main 'error в gcc 4.7

Я скомпилировал со следующими аргументами:

gcc -std=c99 -O2 -DCONTEST -s -static -lm children.c 

Но в Linux я получаю следующее сообщение об ошибке:

/usr/lib/gcc/i486-linux-gnu/4.7/../../../i386-linux-gnu/crt1.o: In function `_start': 
(.text+0x18): undefined reference to `main' 
collect2: error: ld returned 1 exit status 

Почему это? Моя программа работает, и я не могу понять, почему я получаю компиляцию ошибок в Linux.

Мой код:

/*---------------------*/ 
/* included files  */ 
/*---------------------*/ 
#include <stdio.h> 
#include <stdlib.h> 

/*---------------------*/ 
/* defined constants */ 
/* for restriction  */ 
/*---------------------*/ 
#define MIN 1 
#define MAX 1000000 
#define IOERROR 5 // 'Input/Output Error' 

/*---------------------*/ 
/* function prototypes */ 
/*---------------------*/ 
int main(); 
FILE *read_input(const char *filename_r); 
int count_children(FILE *input); 
int pass_heights(FILE *input, int *children, int size); 
int check_tall(const int *children, int size); 
void write_output(const int total,const char *filename_w); 


/*---------------------*/ 
/* start of program */ 
/*---------------------*/ 
int main() { 

    const char *filename_r = "xxx.in"; 
    const char *filename_w = "xxx.out"; 

    FILE *input = read_input(filename_r); 

    int size = count_children(input); 

    int *children = malloc(size * sizeof *children); 
    if (children==NULL) 
    exit(1); //General application error 

    pass_heights(input, children, size); 

    fclose(input); 

    int total = check_tall(children, size); 

    free(children); 

    write_output(total,filename_w); 

    return 0; 
} 

FILE *read_input(const char *filename_r) { 

    FILE *input = fopen(filename_r, "r"); 

    if(input == NULL) 
    exit(IOERROR); 

    return input; 
} 


int count_children(FILE *input) { 

    int count = 0; 
    fscanf(input, "%d",&count); 

    if(count > MAX || count < MIN) 
    exit(1); //General application error 

    return count; 
} 


int pass_heights(FILE *input, int *children, int size) { 

    for(int i = 0; i < size; i++) 
    fscanf(input, "%d",&children[i]); 

    return *children; 
} 


int check_tall(const int *children, int size) { 

    int total = 0; 
    int tmp_max = 0; 
    for(int i = size - 1; i >= 0; i--) 
    { 
     if(children[i] > tmp_max) { 
      tmp_max = children[i]; 
      total++; 
     } 
    } 
    return total; 
} 


void write_output(const int total,const char *filename_w) { 

    FILE *output = fopen(filename_w, "w"); 

    if(output == NULL) 
    exit(IOERROR); 

    fprintf(output, "%d\n", total); 
    fclose(output); 
} 
+2

Вы пропустили самую важную информацию, как вы скомпилируете программу? –

+4

По какой-либо причине у вас есть переднее объявление 'main()'? –

+0

ok Я обновляю свой код. Нет причин для прямого объявления main() только я получаю все на месте –

ответ

0

Вы использовали -static вариант, который изменяет путь исполняемого файла связаны между собой.

Мне не удалось воспроизвести ваше точное сообщение об ошибке, но в моей Linux говорится, что он не может ссылаться на -lc в статическом режиме, и под моей OSX говорится, что он не может найти -lcrt0.o. Для меня в обоих случаях это означает, что система не может найти статическую заглушку.

Если вы удалите -static, он должен работать. Если нет, ваша проблема очень странная.

+0

У меня нет возможности изменить аргументы компилятора –

+0

'-static' в порядке (необходимо связать статически) и не нужно' -lc' (автоматически включается компилятором) (также нет необходимости в ' -lm') Это несвязанные вещи с проблемой. Пожалуйста, ответьте на вопрос, а не на несвязанные вещи. –

+0

@ LuisColorado Я никогда не говорил использовать '-lc' Я сказал, что на моей машине использование' -static' приводит к проблемам, и одна из проблем заключается в том, что ссылка на c-stub ('-lc' опция компоновщика) вызывает проблемы. Используйте '-v', и вы увидите, что я имею в виду ... –

0

Ошибка, которую вы показываете, указывает, что компоновщик не находит функцию main() в вашем коде. Поскольку очевидно, что вы включили его в исходный файл, также очевидно, что вы не компилируете эту командную строку (или вы компилируете в другой каталог, где у вас есть источник non-main() с именем children.c, возможно, сборка система делает touch children.c, если он не находит источник, а затем компилирует его - в этом случае у него не будет main()). Убедитесь, что файлы созданы правильно и где, как я думаю, вы все равно не компилируете этот файл.

Попробуйте использовать простые опции, прежде чем переходить к более сложным. Попробуйте что-нибудь вроде:

gcc -std=c99 -o children children.c 

прежде чем пытаться поэкспериментировать с оптимизацией или статической связью в любом случае. Кроме того, динамическая компоновка обычно лучше, чем статическая, поэтому вы получите меньшие исполняемые файлы (8Kb против 800Kb и несколько копий libc, загружаемых для каждого исполняемого файла). Кроме того, вам не нужно включать -lm, так как вы не используете ни одну из функций <math.h> (при этом это не повредит).

Я скомпилировал источник с помощью следующей командной строки без каких-либо проблем, но у меня есть поддержка статически связанных исполняемых файлов, и, возможно, вы этого не сделали (я бы предположил, что приведенная выше командная строка работает в любом Linux)

$ make CC='gcc' CFLAGS='-std=c99 -O2 -DCONTEST' LDFLAGS='-s -static -lm' children 
gcc -std=c99 -O2 -DCONTEST -s -static -lm children.c -o children 
children.c: In function ‘pass_heights’: 
children.c:81:11: warning: ignoring return value of ‘fscanf’, declared with attribute warn_unused_result [-Wunused-result] 
children.c: In function ‘count_children’: 
children.c:69:11: warning: ignoring return value of ‘fscanf’, declared with attribute warn_unused_result [-Wunused-result] 
+0

Извините, я забыл сказать, что я использую 'gcc 4.6.3', но это может быть не проблема. –

+0

И поэтому вы пробовали без '-статического', это требование, как вы сказали? –

+0

Нет, я попытался с ним, если вы посмотрите, я использовал команду 'make CC = 'gcc' CFLAGS = '- std = c99 -O2 -DCONTEST' LDFLAGS = '- s -static -lm' children', которая заставляет ** make (1) ** использовать опции '-s'' -static' и '-lm' при связывании, если требуется. Он использует все варианты в вопросе. Даже неиспользуемый '-lm' для связывания математических подпрограмм. –

Смежные вопросы