오늘은 C언의 에러에 대해 알아보겠습니다.
어떤 언어 간에 컴파일을 하다보면 많은 에러를 보게됩니다.
에러만 보더라도 어떤건지 파악이 되는 경우가 많습니다.
경력이 쌓이다보니 자연스레 경험이 되는것이죠.
오늘은 undefined reference to 에러에 대해 알아보겠습니다.
결론적으로 이 에러는 컴파일 시, 헤더 파일에 선언은 되어있으나, 소스 파일에 정의가 안되어 있다는 의미입니다.
함수는 보통 헤더 파일에 선언이 되고, 소스 파일에 정의를 하여서 많이 사용합니다.
신입시절에는 에러가 뜨면 습관처럼 에러를 복사하여 구글링하였습니다.
컴파일러는 친절하게 설명해주기 때문에, 에러만 해석하더라도 어느 정도 원인 파악이 가능합니다.
위의 에러를 해석해보면 undefined 즉, 정의가 되어있지 않다는 것입니다.
제 경험상 문제가 없다면 이 것은 헤더파일과 소스 파일의 함수가 뭔가 일치하지 않다는 것입니다.
즉, 오타가 많더라구요. 그 외의 경우는 헤더파일이 빠져있는 경우도 많았습니다.
답글이 한개 달려서, 아래에 예를 한번 들어보겠습니다.
------------------------------------------------------------------------------------------------------------
[root@localhost letitkang]# cat main.c
#include <stdio.h>
int main(){
printNum(1);
return 0;
}
[root@localhost letitkang]# gcc -o main main.c
/tmp/ccEPQ8Q7.o: In function `main':
main.c:(.text+0xf): undefined reference to `printNum'
collect2: error: ld returned 1 exit status
------------------------------------------------------------------------------------------------------------
위의 소스코드를 보면 printNum이라 함수가 있는데, 이 함수는 어디에도 정의되어 있지 않기 때문에 에러가 발생합니다.
printNum 함수를 정의하거나 printNum 함수가 정의되어 있는 소스파일을 같이 컴파일 해야합니다.
저는 소스파일을 한개 만들어서 함수를 정의한 후, 같이 컴파일 하였습니다.
------------------------------------------------------------------------------------------------------------
[root@localhost letitkang]# cat main.c
#include <stdio.h>
int main(){
printNum(1);
return 0;
}
[root@localhost letitkang]# cat print.c
#include <stdio.h>
int printNum(int num){
printf("num : %d\n", num);
return 1;
}
[root@localhost letitkang]# gcc -o main main.c print.c
[root@localhost letitkang]# ./main
num : 1
------------------------------------------------------------------------------------------------------------
원인은 "함수 정의가 안되어 있기 때문에" 위의 에러가 발생합니다.
보통 블로그나 오픈소스 사이트에 있는 함수를 복사한 후, 컴파일을 해보면 이런경우가 많이 발생하는데,
해결책은 "함수가 정의되어 있는 파일을 찾아(혹은 함수를 만들어) 같이 컴파일 하거나, 라이브러리를 추가 후, 컴파일 하면됩니다"
이상입니다.
'프로그래밍 > C' 카테고리의 다른 글
[C] 소켓 옵션 제어 ( getsockopt, setsockopt ) (2) (0) | 2022.02.27 |
---|---|
[C] 소켓 옵션 제어 ( getsockopt, setsockopt ) (1) (0) | 2022.02.23 |
[C] cJSON을 사용하여 json 파싱 (0) | 2021.03.30 |
[C] 정상적으로 tcp 소켓 통신이 종료 되었을 경우 (0) | 2021.03.23 |
[C] epoll 이란 (0) | 2020.12.28 |