main - collect2에 대한 참조가 정의되지 않음: ld가 1개의 종료 상태를 반환했습니다.
프로그램(es3)을 컴파일하려고 하는데 단말기에서 쓸 때:
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
내가 뭘 할 수 있을까?
즉,es3.c
는 정의되지 않습니다.main
기능에서 실행 파일을 생성하려고 합니다.실행 파일에는 진입점이 있어야 하므로 링커는 불만을 제기합니다.
오브젝트 파일에만 컴파일하려면-c
옵션:
gcc es3.c -c
gcc es3.o main.c -o es3
상기 컴파일es3.c
오브젝트 파일로 변환한 후 파일을 컴파일합니다.main.c
를 포함할 수 있습니다.main
링커 머지(marge)를 실행한다.es3.o
그리고.main.o
라고 불리는 실행 파일로es3
.
제 경우 소스 파일을 저장하지 않고 빈 파일을 컴파일하려고 했기 때문입니다.
실행 파일에는 기본 기능이 필요합니다.아래 hello world 데모를 참조하십시오.
#include <stdio.h>
int main(void)
{
printf("Hello world!\n");
return 0;
}
보시다시피 주요 기능이 있습니다.이 메인 기능이 없는 경우 ld는 "main에 대한 참조"를 보고합니다.
결과 확인:
$ 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
아마도 당신의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
더 이상 경고를 받지 않을 때까지요
그-g
깃발 또한 중요하다. 왜냐하면 깃발은gcc
디버깅 정보를 오브젝트 파일 및 실행 파일에 저장합니다.그러면 디버거를 사용할 수 있습니다(예:gdb
프로그램을 디버깅합니다.
개체 파일 또는 실행 파일의 기호 목록을 가져오려면nm
.
물론, GNU/Linux 시스템(그리고 나는 이미 사용하지는 않GNU/Linux을 사용하도록 초대하)을 사용하다고 가정해요.
추가만 하면 됩니다.main
기능을 합니다.예를 들어 다음과 같습니다.
int main()
{
return 0;
}
지금까지 언급되지 못한 한가지 가능성 즉 당신의 편집인은 다른 cwd보다 생각하셨던야 할 수도 있기. 넌 네가 생각하는 것은 파일을 편집하지는 않다는 것입니다.
컴파일 중인 파일에 대해 'more'를 실행하여 원하는 콘텐츠가 있는지 다시 확인합니다.도움이 됐으면 좋겠네요!
, 는 내건 i i i i i i i i i i i i i i i i i i i 。void
이치노
저는 이전에 Windows에서 Visual Studio를 사용했는데, 이것은 전혀 문제가 되지 않았기 때문에, 지금이라도 빼놓을 수 있다고 생각했습니다.
언급URL : https://stackoverflow.com/questions/7965437/undefined-reference-to-main-collect2-ld-returned-1-exit-status
'programing' 카테고리의 다른 글
Vue 앱을 실행할 때 오류 "vue-cli-service: 명령을 찾을 수 없음" (0) | 2022.09.01 |
---|---|
org.hibernate 수정 방법Laze Initialization(레이지 초기화)예외 - 프록시를 초기화할 수 없음 - 세션 없음 (0) | 2022.09.01 |
vue reload 하위 구성 요소 (0) | 2022.09.01 |
bootstrap-vue 테이블의 헤더 행을 숨기는 방법 (0) | 2022.09.01 |
Vuex 모듈의 TypeScript 오류 - 하위 모듈이 Vuex의 인덱스 모듈에 할당할 수 없는 잘못된 오류 (0) | 2022.09.01 |