본문 바로가기

C 언어/임베디드 C

두 함수에 문법적 오류는 없지만 실행 파일이 만들어지지 않는 경우

hello 함수 선언만 되어 있고, 내용은 없는 소스
//파일명 hello.c
#include <stdio.h>

void hello();
int main()
{
 printf("시작\n");
 hello();
 printf("끝\n");
 return 0;
}

main함수선언이 되어있지 않은경우
//파일명 main.c
#include <stdio.h>

void hello()
{
 printf("a\n");
 return;
}

위 두 소스를 봤을때 문법적인 오류는 없다. 그래서 컴파일을 실행하면 오브젝트 *.o 파일까지 만들어진다.
하지만 링크에서 걸리므로 실행파일은 생성되지 않는다.
하지만 오브젝트 파일은 생성되었기 때문에 두 오브젝트 파일을 묶어 아래와 같은 명령어로 실행파일을 만들수 있다.

gcc -o test(실행파일) hello.o main.o

그러면 test.exe파일이 생성된다.
./test 실행결과
시작
a


윈도체제에선 (비주얼스튜디오가 있을 경우)
cl main

/out:main.exe  --> 따로 파일이름을 지정하지 않았기때문에 cl /out:하고싶은파일이름.exe 하면 실행파일명을 입력할 수 있다.
main
main.obj : error LNK2001 : unresolved exterminal symbol _hello 이라는 에러 메시지가 출력된다.
LNK에러 종류는 많음

LINUX에선



위처럼 함수가 없으면
윈도우에선 exterminal symbol
리눅스에선 reference 라는 오류가 나온다.

tip
c언어에선 main을 시작함수로 정해놨기 때문에 반드시 쓰인다.
gcc -c main.c = cl /c main.c
함수도 심볼테이블에 등록된다.
시작함수를 통틀어 entry point(진입점)이라 한다.
컴파일 순서
*c-전처리->*.i-컴파일->*.s-어셈블리->*.o-링크->*exe

'C 언어 > 임베디드 C' 카테고리의 다른 글

함수의 정의  (0) 2011.04.25
makefile 만들어보기  (0) 2011.04.21
구구단 출력하기  (0) 2011.04.19
함수의 호출과 실행  (0) 2011.04.19
함수  (0) 2011.04.19