[C언어] 16강 gcc로 파일을 나눠서 컴파일 하기

강지원·2025년 1월 23일

리눅스 기반 C언어

목록 보기
19/24

1. gcc

gcc (컴파일러) : c언어를 어셈블리어로 번역하는 역할

컴파일러 : 프로그램을 만드는 프로그램
gcc 컴파일러 : 리눅스 운영체제에서 돌아가는 프로그램을 만드는 프로그램

1-1) gcc 옵션

옵션에 따라 컴파일 함

gcc 
gcc -c
gcc -o 

2. 링커

링커 : 컴파일러가 만들어 낸 하나 이상의 목적파일(object 파일)을 가져와 이를 단일 실행 파일로 병합하는 프로그램이다.

source파일 -> object파일 -> 하나의 실행파일(all.out)
a.c -> a.o
b.c -> b.o ----> all.out
c.c -> c.o

여러가지 오브젝트 파일을 다 엮어서 하나의 실행파일(a.out)로 만들어줌

3. 파일 연결해주기

3-1 gcc

gcc [컴파일해줄 파일들] [...] [...]
자동으로 linker가 연결해서 실행파일(a.out)을 만들어줌

3-2 gcc -c

오브젝트파일을 만들어줌

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

3-3 gcc -o

오브젝트파일들을 링킹해줘서 실행파일로 만들어줌

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

3-4

위 2단계를 합친 것

gcc -o [실행파일명(test2)] [소스파일] [소스파일]
-> 원하는 실행파일명으로 실행파일을 만들어준다.

4. 헤더파일의 동작원리

4-1 헤더파일 중복 방지 왜 필요한가?

헤더 파일에 함수의 선언 뿐만이 아니라 구조체를 정의할 수 있다. 구조체를 포함하고 있는 헤더 파일에 중복 선언 방지 처리를 해놓지 않으면 문제가 발생할 수 있게 됩니다.

4-2 헤더파일 중복 상황

main.c

#include <stdio.h>
#include "sum.h"
#include "sumsum.h"

int main(){

        int s = sumsum(3,4);
        printf("s = %d\n",s);

        return 1;

}

sum.h

int sum(int a, int b);

sumsum.h

#include "sum.h"

int sumsum(int a,int b);

위와 같은 코드가 있다.
main.c는 sum.h와 sumsum.h를 포함하고 있는데 sumsum.h에서도 sum.h를 포함하기 때문에 컴파일 에러가 발생할 수도 있다.

그림으로 표현하면 아래와 같다.

sum.h가 두 번 포함되기 때문에 중복을 방지하는 방법을 찾아야 한다

4-3 헤더파일 중복 방지 하는방법

1) #pragma once

두 번 참조되는 헤더파일인 sum.h의 최상단에 #pragma once를 붙이면 자동으로 두번째는 읽기조차 하지않는다.

/* sum.h */
#pragma once

int sum(int a, int b);

일부 컴파일러에서는 지원을 안할 수도 있으니 아래방법을 추천한다.

2) #ifndef

두 번 포함되는 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까지 코드를 실행하지 않는다

5. ifdef VER2 응용방법

/* 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;

}

실행결과1(곱하기)

> gcc -o test main.c sum.c sumsum.c
s = 12

실행결과2(더하기)

gcc -DVER2 -o test main.c sum.c sumsum.c
s = 7

위 방법은 커널 분석할때 많이 쓰임

6. 파일정리하는 방법

6-1 include 폴더만들기

mkdir include

6-2 헤더파일 이동

mv *.h ./include/

6-3 컴파일 할 때 헤더파일 위치 알려주기

gcc -I ./include -o test main.c sum.c sumsum.c

0개의 댓글