컴파일러에서 허용하는 함수에 대한 정의되지 않은 참조

마리안 탈 런게 아누

좋아,이 코드가 있습니다.

str.c :

char *str = "example";

main.c :

int str(void);

int main(void)
{
    str();

    return 0;
}

메이크 파일 :

CC = gcc
CFLAGS = -Wall -g

all: main

main: main.o str.o

main.o: main.c
str.o: str.c

clean:
    rm -rf *.o main

언뜻보기에 정의되지 않은 참조 오류 또는 이와 유사한 오류라고 말할 수 있습니다. 그러나 컴파일러는 단순히이 코드를 받아들입니다.

문제는 왜 컴파일 오류가 발생하지 않습니까?

함수가 제대로 정의되지 않은 것이 분명합니다. gdb를 사용하여 str () 호출을 중단하면 Function str not defined 경고 유형이 표시 됩니다. .

알크

실행 파일을 "구축"하면서 하나가 오류를 예상 한 수 있다면 먼저 (다른 이미 지적) main, 연결 단계에서 다음, 즉 때문 int str(void)입니다 정의되지 않은 컴파일러는하지 않았다, 그래서 모든 번역 단위 (.c 인 파일)에 임의의 개체 파일 (.o)에 배치합니다.

그러나 불행히도 당신은 char * str = "..."정의했습니다.

C (예를 들어 C ++와 같은 다른 언어와 반대로)는 함수에 주석을 달지 않고 함수 서명을 생성하지 않고 함수 이름, 기호 이름 만 만듭니다. 다른 모든 개체에 대해서도 마찬가지입니다.

따라서 링커는 사용 가능한 심볼의 이름을 확인하고 1 : 1과 일치하는지 확인하는 것 외에 다른 선택의 여지가 없습니다. 컴파일러가 확인 정보를 개체 파일에 넣지 않았기 때문에 다시 확인할 수 없습니다.

링크 할 객체 내부 어딘가에 대한 구현 ( 선언이 아닌 정의 )이 있는 경우 링커는 1 : 1 일치가 없음을 알아 차리므로 뭔가 이상한 일이 진행될 수 있습니다.int str(void)

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

참조에 대한 참조는 ISO C ++ 2003 표준에서 허용되지 않지만 컴파일러에서 허용하는 이유는 무엇입니까?

C 컴파일러 오류 : 함수에 대한 정의되지 않은 참조

'check'함수에 대한 정의되지 않은 참조 (MinGW의 GCC 컴파일)

rtems에서 powf 함수 사용 (powf에 대한 정의되지 않은 참조)

avr-gcc 컴파일러 / 링커를 사용하여 연결된 avrfix 라이브러리의 함수에 대한 정의되지 않은 참조

Eclipse의 OpenSSl 앱용 함수에 대한 정의되지 않은 참조

GCC 크로스 컴파일러를 사용할 때 printf에 대한 정의되지 않은 참조

링커 오류, g ++를 사용하여 gcc로 컴파일 된 라이브러리에 연결, 해당 함수에 대한 정의되지 않은 참조

vtable 오류에 대한 정의되지 않은 참조는 최신 g ++ 컴파일러로 해결됩니까?

Linux에서 컴파일 - '_start' 함수에서: (.text+0x20): 'main'에 대한 정의되지 않은 참조

정적 함수에 대한 정의되지 않은 참조

정적 함수에 대한 정의되지 않은 참조

Eclipse CDT의 함수에 대한 정의되지 않은 참조

C ++의 함수에 대한 정의되지 않은 참조

main ()의 함수에 대한 정의되지 않은 참조

MinGW를 사용하는 여러 함수에 대한 SDL2 정의되지 않은 참조

내 함수에 대한 정의되지 않은 참조

'함수'에 대한 정의되지 않은 참조

함수에 대한 정의되지 않은 참조를 Clion

Cgo: [C 함수]에 대한 정의되지 않은 참조

함수 호출에 대한 정의되지 않은 참조

aruco 함수에 대한 정의되지 않은 참조

함수에 대한 정의되지 않은 참조? C ++

'cusolverDn'함수에 대한 정의되지 않은 참조

portaudio 함수에 대한 gcc 정의되지 않은 참조

함수 c에 대한 정의되지 않은 참조

기존 함수에 대한 정의되지 않은 참조

함수에 대한 정의되지 않은 참조 (C ++)

C ++ : void 함수에 대한 정의되지 않은 참조