본문 바로가기

Embeded C

5_3 함수의 분리와 결합


하나의 함수를 두개의 함수로 분리하여 보겠습니다

예제를 보시면 두개의 함수가 하나로 결합되어 있습니다
#include<stdio.h>
void test();
int main()
{
    printf("시작\n");
    test();
    printf("끝\n");
    return 0;
}
void test()
{
    printf("안녕하세요\n");
    printf("안녕\n");
    printf("하이\n");
    return ;
}
위 함수의 결과는 "시작""안녕하세요""안녕""하이""끝"라는 메세지가 출력됩니다

이함수를 main.c test.c 두개의 함수로 나누어 보겠습니다
>>main.c
#include<stdio.h>
int main()
{
    printf("시작\n");
    test();              
    printf("끝\n");
    return 0;
}

>>test.c
#include<stdio.h>
void test()
{
    printf("안녕하세요\n");
    printf("안녕\n");
    printf("하이\n");
    return ;
}

참고) 현재 두파일은 컴파일시 오류가 발생 할 수 밖에 없습니다
그럼 linux window에서 컴파일을 해보겠습니다
linux)gcc -o main main.c
window)cl main.c

각각 에러메세지가 출력되는데..주목해야될 문장을 보면
linux) in function
        undefined reference
        collect

window) out : main.exe
             error LNK2001: unresolved externals symbol _test
             fatal error LNK1120:1 unresolve....

위 결과 몇가지 사실을 알수있습니다.

1> collect (링크단계)/ error LNK2001 (컴파일 5단계중 링크에서 실행파일을 만들지 못하고 에러가 났습니다)
2> undefined reference = unresolved externals 같은 말로 호출하는 함수test()가 없어서 난 에러 임을 나타냅니다
3> symbol _test라는 문장을 보아 함수도 symbol table에 포함이 된다는 것을 알수있습니다
4> 기타 등등

위 사실로 보아서 두함수가 떨어져 있기에 실행파일을 만들수 없지만 링크 단계에서 이런한 문제를 해결해준다면
제일 처음에 결합된 형태로 에러가 발생하지 않고 출력을 할수 있습니다

방법은 두함수를 결합하면 됩니다
쉽게 말해 링크 단계에서 test()의 함수를 main() 에 불러와서 사용 할수 있으면 됩니다.

방법은 일단 링크 단계까지는 진행을 합니다
링크단계 파일은 *.o로 나타내는데

linux)gcc -c *c(해당디렉토리내 모든 파일 컴파일) 혹은 gcc -c main.c // gcc -c test.c로 개별로 컴파일합니다

그럼 main.o와 test.o 파일이 생성되었습니다 실행파일 만들기 전 단계인 링크단계까지의 파일입니다

그럼 이 두파일을 결합을 하는 방법은

linux)gcc -o main main.o test.o

main이 생성되고 실행하면
"시작""안녕하세요""안녕""하이""끝"라는 메세지가 출력됩니다

왜? 이런방법을 사용해야 되는걸까?
그것은 복잡한 프로젝트에서 서로 개인 개별 프로젝트를 진행한후 합쳐야될 생황이 왔을때 유용하게 사용됩니다. 

'Embeded C' 카테고리의 다른 글

5_5 함수의 정의  (0) 2011.04.25
5_4 리눅스 make 명령어  (1) 2011.04.20
IEEE 754 표준 32비트 부동소수점 표현  (2) 2011.04.20
5_2 함수의 호출과 실행(작성중)  (0) 2011.04.20
5_1 함수  (0) 2011.04.19