본문 바로가기
OS/Linux

[C/Linux] 헤더 파일

by dev_Step 2022. 5. 16.

 

헤더 파일에 앞서 빌드란...

 

소스코드가 전처리-> 컴파일 -> 어셈블 -> 링크, 단계를 거쳐서 실행파일이 생성되는 것을 말한다.

 

보통 gcc 컴파일러를 통해서 컴파일을 하면 

gcc -c main.c --> 를통해서 오브젝트 코드인   main.o 파일을 생성할 수 있다

gcc -o [test] main.c --> 를 통해서 바로 실행파일인 a.out 또는 test 파일을 생성할 수 있다.

 

컴파일을 통해서 .o (오브젝트 코드)를 생성한다음에  여러개의 오브젝트 파일을 묶어서  실행파일을 만들 수 있다.

gcc -o test main.o sum.o double.o --> test라는 실행파일이 생성된다.

 

 

 

---------------------------------------------------------------------------------------------------------------------------

헤더파일이란 말그대로 main 함수에서 사용할 함수를 선언해 놓은 서비스전용 파일이라고 생각하면 될것 같다.

 

맞는 표현인지는 모르겠지만 선언부와 구현부를 나눠 놓고 관리한다고 이해를 했다.

 

왼쪽) sum.h   오른쪽) sum.c

왼쪽에서는 sum.h에서 구조체와 sum 함수를 선언 한것을 볼수있고

sum.c 파일에서는  해당   sum.h 파일을 include 하여 sum함수를 구현한 것을 볼수 있다.

 

이렇게 구현한 sum.h를 main 에서 사용하는 방법은

main.c 에서 

새로 정의한 함수의 헤더파일을 include 해준다음에

컴파일 할때 gcc main.c sum.c 이렇게 사용해주면됩니다.

하지만 main.c 만 재료로 컴파일하게되면 undefined reference to 'sum' 을 확인할 수 있고

gcc main.c sum.c 을 모두 적어 컴파일하면 정상적으로 컴파일 할 수 있습니다.

* 만약 컴파일 간에 sum.h, sumsum.h 가 같은 폴더에 존재하지 않다면 오류가 발생합니다.

 - 이경우는 sum.h 파일이 어디에 있는지 지칭을해주면 되는데 gcc 옵션인 -I 를 사용하면됩니다.

gcc -I ./include -o [생성할 실행파일명] 재료1 재료2 재료3 

 

 

이때 주의해야 할 점으로.. 헤더파일의 중복 정의가 발생하게 되면 에러가 발생하게 됩니다.

왼쪽부터 sumsum.h  

가운데 main.c

오른쪽 sum.h

파일인데 

현재 main.c 에서 include 한것을 보면 

<stdio.h> 제외

 

sum.h 파일과 

sumsum.h 파일을 include 한것을 확인 할 수 있습니다.

 

또한 현재 sumsum.h 파일을 보면   sum.h 파일이 include 된것을 확인할 수 있습니다.  현재 상황을  

나타내보면

 

 

 

-----중간 생략-----

#define MAX 10;

typedef struct{

 int a;

 int b;

}test;

int sum(int a, int b);

 

#define MAX 10;

typedef struct{

 int a;

 int b;

}test;

int sum(int a, int b);

int sumsum(int a, int b);

 

이와같이 sum.h 가 두번 정의되어 중복으로 선언된 것을 확인할 수 있고 그결과 컴파일 시에

아래와 같이 conflicting 이 일어나는 것을 확인 할 수 있다.

그렇기 때문에 헤더 파일을 추가할때는 항상 

해당 해더 파일이 선언되어 있지 않을 경우에 추가하는  표시인

#ifndef __SUM_H__

#define __SUM_H__

 

-----생략-----

#endif

를 사용하거나

#pragma once를 통해서 중복 으로 헤더 파일이 선언되지 않도록 해준다.

#ifndef   __ 

#define  __ 

----------

#endif 를 선언한 후 정상적으로 컴파일 되는 것을 확인 할 수 있다.

 

 

추가 적으로 

#ifdef 

#else

#endif

를 구현부에서 사용할 수 있는데 

#define VER2 로 정의가 되어있으면 

sum함수를 +로 구현하는것과 

그렇지 않으면 * 함수로 구현하는 것을 볼수 있는데 이것은

 

 

컴파일시에   

gcc -DVER2 (define) -O main.c sum.c sumsum.c 하면 #define VER2 로 정의된것으로 컴파일이 되고 + 가되지만

그냥 

gcc -o main.c sum.c sumsum.c 하면 #define VER2가 정의되지 않아 * 로 나온다 이것을

 

#define하는 위치는

sum.h 파일에 #define 해주면된다.

 

 

 

 

 

include 파일을 다른 디렉토리에 정리되어 있는 상태에서 

main.c를 컴파일 할려고 하면

위와 같은 에러가 발생합니다. 파일을 찾지 못한다는

그래서 해당  .h 파일의 위치를 알려줘야 합니다.

 

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

옵션 뒤에 헤더 파일 탐색할 기본 디렉토리 추가해줄것을 써준다.

 

 

'OS > Linux' 카테고리의 다른 글

[Linux/C] 파일 입-출력2  (0) 2022.05.25
[Linux/C] Makefile  (1) 2022.05.19
[Linux/C] GDB  (0) 2022.03.25
[Linux/C] 함수 포인터  (0) 2022.03.24
[Linux/C] 포인터  (0) 2022.03.23