내장형 하드웨어/C언어

컴파일 5단계, 분할 컴파일, linux 기본 명령어 복수

동화다아아 2011. 4. 20. 15:55
 

- linux 기본 명령어 복습


ls → 디렉토리와 파일목록을 보여준다.

ls -l → 디렉토리(폴더)와 파일을 분리해서 나타내 준다.

ls -a → 숨겨진 파일을 보여준다. 숨겨진 파일은 파일명 가장 앞부분에 “.”이 들어가 있다.

        또한, 보통 파일명 앞에 .을 붙이면 그 파일은 숨겨진 파일로 변하게 된다.

ls -al → a와 l의 특징을 모두 표현한다.


pwd → 현재 경로를 출력해 준다.

cd .. → 한단계 위로 올라간다.

cd / → 최상위 디렉토리로 이동.

cd /home/trainer2 → 루트에서 /home/trainer2로 한번에 이동.

mkdir → 디렉토리 생성.

rmdir → 디렉토리 삭제.

cp 파일1 파일2 → 파일1이 파일2라는 이름으로 복사.

rm(ReMove) → 파일 삭제

mv(MoVe) 복사원본 복사사본 → 파일 이동(cp와는 달리, 파일이 복사된 후 원본 파일은 삭제. 따라서 파일 이름을 변경할 때 많이 쓰인다.)


컴파일 5단계 복습.

- 전처리(processer) → 2. 전처리 파일("xx.i") → 3. 컴파일러(compiler) → 4. 어셈블리어파일(“xx.s") → 5. 어셈블러(assembleer) → 6. 오브젝트(”xx.o") → 7. 링커(Linker) → 8. 실행파일(*.exe)


⇒ 전처리 단계

- #include, #define등의 전처리 처리

- #include 헤드파일지정시 < > : 기본디렉토리 “ ” : 현재디렉토리에서 head파일을 참조한다.

- 그 결과로 "xx . i" 파일 생성

- "xx . i" 파일엔 키워드를 쓰게끔 전역함수가 설정 되어있다. ex)printf, scanf 등

 

⇒ 컴파일 단계

- 어셈블리어 파일 생성하는 단계 임시파일임

- 컴퓨터가 읽을수 있게 숫자등으로 치환 // 치환화일을 "xx . s"저장

 

⇒ 어셈블리어 단계

- 기계어코드( "xx . s" )을 읽어서 목적코드( "xx . o" )를 생성하는 단계

 

⇒ 링크 단계

- 여러개의 파일로 나누어져 있거나, 라이브러리 함수 등이 존재 할 때 서로 연결 시켜서 실행 가능한 프로그램으로 생성하는 단계


⇒ 실행파일 생성

- 링크단계가 끝나면 실행파일이 생성된다.


⇒ gcc -c (이름).c → 오브젝트 파일 생성(linux)

⇒ cl (이름).obj → 오브젝트 파일 생성(win)


gcc -c main.c → 컴파일 다섯단계 중 오브젝트 파일(.o)까지 이상이 없을 경우에 에러없이 실행된다. 즉, 여기까지 이상없이 진행이 된다면 문법적인 오류는 없다는 뜻.



- main 함수와 Hello 함수를 분리시켜서 분할 컴파일 하는 과정

// main.c

#include<stdio.h>

void Hello();

int main()

{

        printf("-----시작-----\n");

        Hello();

        printf("-----끝-----\n");

        return 0;

}

// hello.c

#include<stdio.h>

void Hello()

{

        printf("Hello everyone!!!\n");

        printf("C programming is interesting\n");

        printf("but, C programming is difficult\n");


        return ;

}

각각의 파일을 컴파일 해보면 다음과 같은 에러가 발생한다.

 

각각 main.c를 컴파일 했을 때.

linux에서 

undifined reference to 'Hello' collect2; ~

                → 'Hello' 파일이 참조 정의되어 있지 않다.

                collect 2는 링크 단계에서 오류가 발생했다는 뜻이다.

                → 즉, 실행시킨 main.c 파일에서 Hello 함수를 찾을 수 없다는 뜻.

                → 하지만 링크 단계 전에 오류가 없다는 것으로 문법적이 오류는 찾을 수 없다는 것을 확인할 수 있다.

win 에서

main.obj : error LNK2001: unresolved external symbol _Hello

main.exe : fatal error LNK1120: 1 unresolved externals

                → linux의 reference 처럼 external symbol 이 출력되며 에러가 표시된 것을 볼 수 있다. 역시 마찬가지로 _Hello 파일이 정의되지 않았다는 뜻이다.

                → _Hello에서 '_'는 어셈블리어로 변환되면서 함수앞에 자동으로 언더바가 붙게 된 것이다.

                → symbol이라는 표현이 있는데 함스도 심벌테이블에 등록된다는 뜻이다. 즉 함수도 type 가진다는 뜻.

⇒ hello.c의 컴파일도 동일하다.

※ C는 프로그램 시작할 때 제일 처음 시작하는 함수 이름이 main이다. 즉, main 함수는 반드시 있어야 하는데 C에서는 main, win에서는 winmain 등 이름은 다를 수 있다. 이와 같은 것을 entry point(진입점)이라고 한다.

⇒ 나누어진 두 파일을 컴파일을 통해 합친다.

 → main.c 와 hello.c 파일을 gcc -c 명령을 통해 main.o 와 hello.o 파일을 생성하여 분할 컴파일을 실시한다.

 → gcc - c *.c (→ win 에서는 cl 파일이름.obj)

 →

 → gcc - o 실행파일 이름 main.o hello.o 라고 하면 두 파일이 합쳐져 컴파일 된다.         


※ 컴파일러는 표준함수(ex. printf ...)는 자동으로 .o 파일을 생성해 준다.(.lib 은 각종 .o 파일을 모아둔다.)