programing

main - collect2에 대한 참조가 정의되지 않음: ld가 1개의 종료 상태를 반환했습니다.

bestcode 2022. 9. 1. 23:18
반응형

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

반응형