ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C 언어 기초 정리 09] 컴파일과 gcc , 헤더 파일(.h)
    개발 이야기/C 2023. 9. 30. 13:20

    헤더파일(.h)

    c에서 함수는 사용되기 전에 먼저 함수의 원형이 선언되어야한다. 즉, c파일을 따로 만들었을 때, 해당 함수(c내의)와 관련된 정보를 가지고 있는 파일이 필요한데 이를 헤더 파일이라고 한다. 

    즉, 우리가 include 하는 .h 파일이 헤더파일이다. 

    사용자 헤더 파일은 아래와 같이 작성된다. 

    float muller(float (*func)(float), float x0, float x2, float xacc);

    위의 예시는 muller라는 .c 파일에 관한 헤더파일이다. 

    즉, 우리의 c파일 내에서 새로 작성한 함수를 선언하면 된다. 

     

    gcc를 이용한 컴파일

    gcc는 유닉스 계열에서 주로 사용하는 C/C++ 컴파일 도구로 개발되었으나 이후 objectve c, 파스칼, 에이다 등을 지원하면서 GNU Complier Collection으로 변경된 컴파일러다. 

    gcc 컴파일 단계

    gcc가 설치되어있는지 알아보는 방법에는 아래와 같은 코드를 cmd에 쳤을 때 무엇인가 뜬다면 문제 없는 것이다. 

    gcc --version

    파일 확장자에 따른 컴파일 방법

    gcc로 전처리, complie, assmbler, linking을 모두 거쳐야하지만 파일 타입에 따라 조금의 처리방식의 차이는 있다. 

    위의 그림을 보면 이해가 더 쉬울 것이다. 

    확장자 종류 처리방법
    .c c 소스 파일 gcc로 전처리, 컴파일,어셈블, 링크
    .c, .cc c++ 소스 파일 g++로 전처리, 컴파일, 어셈블,링크
    .i 전처리 된 c파일 gcc로 컴파일,어셈블, 링크
    .ii 전처리 된 c++파일 g++로  컴파일, 어셈블,링크
    .s, .S 어셈블리 파일 어셈블 링크
    .o 오브젝트 파일 링크

     

    gcc 옵션 및 실제 사용 예시 

    옵션 의미
    -E 전처리를 실행하고 컴파일을 중단하게 한다.
    -c 소스 파일을 컴파일만 하고 링크를 수행하지 않으며, 오브젝트 파일을 생성한다.
    -o 출력 파일 이름을 지정하는데, 지정하지 않으면 a.out라는 기본 이름이 적용된다.
    -I 헤더 파일을 검색하는 디렉토리 목록을 추가한다.
    -L 라이브러리 파일을 검색하는 디렉토리 목록을 추가한다.
    -l 라이브러리 파일을 컴파일 시 링크한다.
    -g 바이너리 파일에 표준 디버깅 정보를 포함시킨다.
    -ggdb 바이너리 파일에 GNU 디버거인 gdb만이 이해할 수 있는 많은 디버깅 정보를 포함시킨다.
    -O 컴파일 코드를 최적화시킨다.
    -ON 최적화 N 단계를 지정한다.
    -DFOO=RAR 명령라인에서 BAR의 값을 가지는 FOO라는 선행 처리기 매크로를 정의한다.
    -static 정적 라이브러리에 링크한다.
    -ansi 표준과 충돌하는 GNU 확장안을 취소하며, ANSI/ISO C 표준을 지원한다. 이 옵션은 ANSI 호환 코드를 보장하지 않는다.
    -traditional 과서 스타일의 함수 정의 형식과 같이 전통적인 K&R(Kernighan and Ritchie) C 언어 형식을 지원한다.
    -MM make 호환의 의존성 목록을 출력한다.
    -V 컴파일의 각 단계에서 사용되는 명령어를 보여준다.

    실제 예시 코드를 보자. 아래와 같다.

    gcc -o RootFinding main.c muller.c  ../NRs/ansi/recipes/rtbis.c  ../NRs/ansi/recipes/nrutil.c ../NRs/ansi/recipes/bessj0.c ../NRs/ansi/recipes/bessj1.c ../NRs/ansi/recipes/zbrak.c ../NRs/ansi/recipes/rtflsp.c ../NRs/ansi/recipes/rtsec.c ../NRs/ansi/recipes/rtnewt.c ../NRs/ansi/recipes/rtsafe.c -I ../NRs/ansi/other

    우선 -o 옵션으로 출력 파일의 이름을 지정한다. RootFinding.exe이라는 파일이 생성될 것이다.

    gcc -o name: name이라는 output file생성

    이후 컴파일할 c파일들을 지정해준다. 현재 폴더를 기준으로 하고 있다. 

    이때 include한 모든 c파일을 함께 적어줘야한다. 

    이후 -I 옵션을 통해 헤더파일을 찾을 디렉토리를 지정해준다. 

    gcc -I directory: directory에서 헤더파일을 찾는다

    위에서 사용하지 않은 -c옵션은 분리 컴파일 시 많이 사용된다. 

    만약에 main.c와 main.c에서 호출하는 함수가 작성된 hi.c가 있다고 해보자. 


    gcc main.c hi.c -o test
    ./test Hi

    위 코드로 실행하면 에러가 날 수 있는데 이를 분리컴파일 하여 오브젝트 파일까지만 생성한지 나중에 링크하면 에러가 생기지 않는다. 또 이후 외부파이릉ㄹ 수정할고 나서 다시 컴파일하는 것도 가능하다.

     
    gcc -c main.c
    gcc -c hi.c
    gcc main.o hi.o -o test //각자 object파일까지만 만들고 이후 다시 컴파일

    # hi.c를 수정하고 나서 다시 컴파일
    gcc -c hi.c
    gcc main.o hi.o -o test

     

    실행은 exe파일을 실행하면된다. 

    ./ exe파일이름

     

    make를 이용한 컴파일

    간단한 소스코드 파일 한두개가 아니라 컴파일해야할 코드의 수가 많아지면 gcc방식으로 하나씩 입력하여 컴파일을 하는 것은 매우 불편하다. 이를 쉽게 컴파일하기 위해 사용하는 것이 make이다. 

    makefile에 make에 실행할 규칙, 컴파일 방법들을 작성해두면 된다. 

     

    makefile의 구성요소

    makefile은 아래의 구조로 되어있다.

    CC = gcc
    target1 : dependency1 dependency2
      command1
      command2
      
    target2 : dependency3 dependency4
      command3
      command4

    각 구성요소는 아래와 같다. 

    -목적파일(Target) : 명령어가 수행되어 나온 결과를 저장할 파일
    -의존성(Dependency) : 목적파일을 만들기 위해 필요한 재료
    -명령어(Command) : 실행 되어야 할 명령어들
    -매크로(macro) : 코드를 단순화 시키기 위한 방법

    그럼 실제 적용코드를 봐보자.

    runMachar : ./Machar/main.c ../NRs/ansi/recipes/machar.c ../NRs/ansi/other/nr.h
    	gcc -o runMachAr ./Machar/main.c ../NRs/ansi/recipes/machar.c -I ../NRs/ansi/other
    
    runRootFinding : ./RootFinding/main.c ../NRs/ansi/recipes/rtbis.c ../NRs/ansi/recipes/rtflsp.c ../NRs/ansi/recipes/rtne
    	gcc -o runRootFinding ./RootFinding/main.c ../NRs/ansi/recipes/rtbis.c ../NRs/ansi/recipes/rtflsp.c ../NRs/ansi/r
    
    clean :
    	rm -rf *.o *.exe

    보면 runMachar에 해당하는 파일들이 변경되었을 때 gcc옵션에 의해 모두 컴파일 되는 것을 확인 가능하다. 

    또한 clean에서 object파일과 실행파일을 삭제하는 코드가 적혀있음을 볼 수 있다.

Designed by Tistory.