좋아,이 코드가 있습니다.
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] 삭제
몇 마디 만하겠습니다