2011-11-01 2 views
25

프로그램 (es3)을 컴파일하려고하는데main - collect2에 대한 정의되지 않은 참조 : ld가 1 종료 상태를 반환했습니다.

gcc es3.c -o es3

이 메시지가 나타납니다.

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

어떻게해야합니까?

+0

이 오류를 일으키는 코드를 게시하는 것이 좋습니다. – Lundin

+1

@BrandoSK : 링크를 따라 가면 45 초 카운트 다운이됩니다. 코드를 질문의 일부로 게시하거나 문제를 설명하고 게시하는 작은 예제로 범위를 좁 힙니다. –

+0

Ok, 방금 원본 파일을 다운로드했습니다. (1)'es3.c'가 아니라'es3_f3.c'라고합니다. (2) 여러 줄의 오류가 있습니다. 예를 들어 줄 18에 누락 된 세미콜론이 있습니다. 컴파일되지 않았을 수 있습니다. 즉,보고 한 링커 오류를 볼 수 없을 정도로 길어질 수는 없습니다. 실제 코드를 보여주세요. (다운로드 된 소스 파일은 73 줄로, 여기에 직접 글을 올릴 수있을만큼 짧습니다.) –

답변

38

즉, es3.cmain 함수를 정의하지 않으며 그 중 실행 파일을 만들려고합니다. 실행 파일은 진입 점을 가져야하므로 링커가 불평합니다. 오브젝트 파일로 컴파일 만하기

에서, -c 옵션 사용 : 위의 오브젝트 파일에 es3.c을 컴파일

gcc es3.c -c 
gcc es3.o main.c -o es3 

을 다음 main 기능을 포함 할 파일 main.c을 컴파일하고, 링커는 es3.o을 병합 main.oes3이라는 실행 파일에 저장됩니다.

+2

문제는 내 프로그램에 주요 기능을 넣었다는 것입니다. 왜 그런지 이해가 안됩니다./ – bransharp

2

실행 파일에는 main 함수가 필요합니다. hello world 데모 아래에서 확인하십시오.

#include <stdio.h> 
int main(void) 
{ 
     printf("Hello world!\n"); 
     return 0; 
} 

주요 기능이 있습니다. 이 주요 기능이없는 경우 ld는

내 결과를 확인 "기본에 정의되지 않은 참조를 '"보고합니다

$ cat es3.c 
#include <stdio.h> 
int main(void) 
{ 
    printf("Hello world!\n"); 
    return 0; 
} 
$ gcc -Wall -g -c es3.c 
$ gcc -Wall -g es3.o -o es3 
~$ ./es3 
Hello world! 

메인 기호가 있는지 확인하기 위해 $ objdump -t es3.o을 사용하십시오. 아래는 내 결과입니다.

$ objdump -t es3.o 

es3.o:  file format elf32-i386 

SYMBOL TABLE: 
00000000 l df *ABS* 00000000 es3.c 
00000000 l d .text 00000000 .text 
00000000 l d .data 00000000 .data 
00000000 l d .bss 00000000 .bss 
00000000 l d .debug_abbrev 00000000 .debug_abbrev 
00000000 l d .debug_info 00000000 .debug_info 
00000000 l d .debug_line 00000000 .debug_line 
00000000 l d .rodata  00000000 .rodata 
00000000 l d .debug_frame 00000000 .debug_frame 
00000000 l d .debug_loc  00000000 .debug_loc 
00000000 l d .debug_pubnames  00000000 .debug_pubnames 
00000000 l d .debug_aranges 00000000 .debug_aranges 
00000000 l d .debug_str  00000000 .debug_str 
00000000 l d .note.GNU-stack  00000000 .note.GNU-stack 
00000000 l d .comment  00000000 .comment 
00000000 g  F .text 0000002b main 
00000000   *UND* 00000000 puts 
+0

답변을 주셔서 감사합니다,하지만 내 프로그램 안에 주요 기능이 있습니다 : ( 컴파일러가 그것을 읽지 않는 이유를 이해하지 못한다 :( – bransharp

+0

내 리눅스에서 확인했습니다, 그것을 확인하십시오. – Daniel

+1

당신이 정말로 메인을 가지고 있다고는 생각하지 않습니다, 그것은 전처리기에 의해 스킵되어서, 내부 또는 정적으로 만들어지는 가려진 것입니다 ... 당신의 파일을 들여 쓰기하려고하면, 그것은 당신에게 더 읽기 쉽습니다 ... –

10

아마도 당신의 main 기능은 다음 이유로 인해 주석 처리 된 예를 들면, 전처리. 전처리 과정을 배우려면 gcc -C -E es3.c > es3.i을 시도한 다음 생성 된 파일 es3.i (및 그 안에 main 검색)에 편집기로보십시오.

먼저, (당신이 초보자이기 때문에) 당신은 항상

gcc -Wall -g -c es3.c 
    gcc -Wall -g es3.o -o es3 

-Wall 플래그가 매우 중요 컴파일해야하며, 항상 사용합니다. 컴파일러에서 (거의) 모든 경고를 제공합니다. 그리고 경고가 들릴 때까지 항상 경고 (예 : es3.C)의 소스 코드 파일을 수정해야합니다.

gcc은 개체 파일과 실행 파일에 디버깅 정보를 넣으려고하기 때문에 -g 플래그도 중요합니다. 그런 다음 디버거 (예 : gdb)를 사용하여 프로그램을 디버깅 할 수 있습니다.

개체 파일이나 실행 파일의 기호 목록을 얻으려면 nm을 사용할 수 있습니다.

물론 GNU/Linux 시스템을 사용하고 있다고 가정합니다. 이미 사용하지 않으면 GNU/Linux를 사용하도록 초대합니다.

+0

예. 우분투를 사용하고 있습니다! 나는 가서 너에게 고맙다고 말하는 것을 시도 할 것이다 ..! – bransharp

0

지금까지 언급되지 않은 가능성 중 하나는 내가 생각하는 파일을 편집하지 않았을 가능성입니다. 귀하의 편집자는 귀하가 생각한 것보다 다른 설명을 가지고있을 수 있습니다.

컴파일하고있는 파일에 'more'를 실행하면 실제로 원하는 내용으로되어 있는지 다시 한번 확인하십시오. 희망이 도움이됩니다!

0

main 함수를 추가하면이 문제를 해결할 수 있습니다. 같이 :

int main() 
{ 
    return 0; 
} 
관련 문제