컴파일 5단계, 분할 컴파일, linux 기본 명령어 복수
- 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 파일을 모아둔다.)
'내장형 하드웨어 > C언어' 카테고리의 다른 글
#define, 함수 인자, 반환(return, printf) (0) | 2011.04.22 |
---|---|
makefile 사용방법(rm, -rf, echo, @), linux 용어(sshd,server,client,path,set), ATmega makefile 분석 (3) | 2011.04.21 |
포인터 - CPU와 BUS MEMORY간 전송과정, void, return, 함수 (0) | 2011.04.19 |
포인터 - 포인터 변수가 가리키는 자료형의 의미, 세그먼테이션(segmentation) (0) | 2011.04.18 |
포인터 변수의 변화, 주소 저장 방식 - Big Endian, little Endian (1) | 2011.04.15 |