gcc (컴파일러) : c언어를 어셈블리어로 번역하는 역할
컴파일러 : 프로그램을 만드는 프로그램
gcc 컴파일러 : 리눅스 운영체제에서 돌아가는 프로그램을 만드는 프로그램
옵션에 따라 컴파일 함
gcc
gcc -c
gcc -o
링커 : 컴파일러가 만들어 낸 하나 이상의 목적파일(object 파일)을 가져와 이를 단일 실행 파일로 병합하는 프로그램이다.
source파일 -> object파일 -> 하나의 실행파일(all.out)
a.c -> a.o
b.c -> b.o ----> all.out
c.c -> c.o
여러가지 오브젝트 파일을 다 엮어서 하나의 실행파일(a.out)로 만들어줌
gcc [컴파일해줄 파일들] [...] [...]
자동으로 linker가 연결해서 실행파일(a.out)을 만들어줌

오브젝트파일을 만들어줌
gcc -c [소스파일] [소스파일]
-> 오브젝트 파일을 생성

오브젝트파일들을 링킹해줘서 실행파일로 만들어줌
gcc -o [실행파일명(test)] [오브젝트파일(.o)] [오브젝트파일(.o)]
-> 원하는 실행파일명으로 실행파일을 만들어준다.

위 2단계를 합친 것
gcc -o [실행파일명(test2)] [소스파일] [소스파일]
-> 원하는 실행파일명으로 실행파일을 만들어준다.

헤더 파일에 함수의 선언 뿐만이 아니라 구조체를 정의할 수 있다. 구조체를 포함하고 있는 헤더 파일에 중복 선언 방지 처리를 해놓지 않으면 문제가 발생할 수 있게 됩니다.
#include <stdio.h>
#include "sum.h"
#include "sumsum.h"
int main(){
int s = sumsum(3,4);
printf("s = %d\n",s);
return 1;
}
int sum(int a, int b);
#include "sum.h"
int sumsum(int a,int b);
위와 같은 코드가 있다.
main.c는 sum.h와 sumsum.h를 포함하고 있는데 sumsum.h에서도 sum.h를 포함하기 때문에 컴파일 에러가 발생할 수도 있다.
그림으로 표현하면 아래와 같다.

sum.h가 두 번 포함되기 때문에 중복을 방지하는 방법을 찾아야 한다
두 번 참조되는 헤더파일인 sum.h의 최상단에 #pragma once를 붙이면 자동으로 두번째는 읽기조차 하지않는다.
/* sum.h */
#pragma once
int sum(int a, int b);
일부 컴파일러에서는 지원을 안할 수도 있으니 아래방법을 추천한다.
두 번 포함되는 sum.h에 조건문을 붙여 한번만 실행되게 하는 코드이다.
/* sum.h */
#ifndef __SUM_H__
#define __SUM_H__
int sum(int a, int b);
#endif
첫번째 sum.h:
1번라인에서 __SUM_H__가 아직 정의되지 않았기 때문에 #endif를 만날때까지 코드를 실행한다.
2번 라인에서 __SUM_H__를 정의
두번째 sum.h:
이미 첫번째에서 __SUM_H__가 정의되었기 때문에 #endif까지 코드를 실행하지 않는다
/* sum.c */
#include "sum.h"
#ifdef VER2
int sum(int a,int b){
return a + b;
}
#else
int sum(int a,int b){
return a * b;
}
#endif
/* main.c */
#include <stdio.h>
#include "sum.h"
#include "sumsum.h"
int main(){
int s = sum(3,4);
printf("s = %d\n",s);
return 1;
}
> gcc -o test main.c sum.c sumsum.c
s = 12
gcc -DVER2 -o test main.c sum.c sumsum.c
s = 7
위 방법은 커널 분석할때 많이 쓰임
mkdir include
mv *.h ./include/
gcc -I ./include -o test main.c sum.c sumsum.c