• gcc에서 헤더파일 포함시켜서 컴파일 하는 법

    2020. 4. 30.

    by. ugonfor

    처음에 gcc를 사용하게 되면, visual studio의 경우에는 헤더파일을 단순히 분류만 잘하면 되었었는 데, gcc는 그런 gui가 없기에 당황하게 될 수 있다.

    나도 처음 gcc를 사용했을 때, 당황한 경험이 있고, 블로그에다가 다른 블로그 포스팅한 것을 스크랩했었다.

    그런데, 이제 어떻게 헤더파일을 포함해서 컴파일 하는 지 제대로 배워서 다시 포스팅하고자 한다..

    Makefile

    Makefile은 그냥 make 커맨드를 치면 빌드를 다 해주는 파일이다.

     

    헤더 파일을 만들어야 하는 코드를 짜는 경우에는 Makefile을 만드는 것이 필수이다. 물론 그러지 않으면 동작하지 않는 것은 아니지만, 매번 위 과정을 해주는 것은 매우 번거롭고, 코드를 공유했을 때도 Makefile이 없으면 사용자가 어떤 코드를 어떻게 컴파일 해야하는 지 모르니 Makefile을 꼭 만들어 주도록 하자.

     

    git clone을 했을 때, Makefile을 만나게 된다면, make를 한번 쳐주자. 그러면 우리가 원하는 바이너리들이 모두 완성될 것이다. 그런 Makefile을 어떻게 만드느냐?

     

    아래 예시를 보자.

    all: sum_test
    
    sum_test: sum.o main.o
        g++ -o sum_test sum.o main.o
    
    sum.o: sum.h sum.cpp
        g++ -c -o sum.o sum.cpp
    
    main.o: main.cpp sum.h
        g++ -c -o main.o main.cpp
    
    clean:
        rm -f sum_test *.o

    위 Makefile에서 all: 은 그냥 make를 했을 때 동작하는 것이다.

    all 옆에 있는 바이너리 sum_test가 필요하다는 뜻이다. 즉, sum_test를 만들겠다는 뜻이다.

    그래서 make를 하게 되면 sum_test가 있어야 완료가 된다. 

    그런데, sum_test가 없으면 어떻게 하는 가?

     

    바로 아래에 sum_test: sum.o main.o 이런식으로 텍스트가 있는 것을 확인할 수 있다.

    이는 무슨 뜻이냐면, sum_test를 만들려면 sum.o main.o가 필요하다는 뜻이다.

     

    만약에 sum.omain.o가 존재한다면, g++ -o sum_test sum.o main.o를 실행한다.

     

    그런데 이때또, sum.o, main.o가 없으면 바로 아래에 sum.o: ~ / main.o: ~를 참고하게 된다.

     

    sum.osum.hsum.cpp를 필요로 하고, 두 파일이 모두 있다면, 바로아래에 쓰인 g++ -c -o sum.o sum.cpp를 실행하게 된다.

     

     

    이렇게 make파일은 동작하게 된다.

    제일처음에 말했던 all: sum_test 이부분도 사실은 sum\_test를 만들겠다는 것이 아니라, sum\_test를 필요로 한다는 것이고, 만약 그 아래에 특정 명령어가 있으면 sum\_test가 있으면 실행했을 것이다.

    마지막으로 clean:이 있는 데, 이부분은 make clean을 하게되면 동작하는 것이다.

    이런 것이 바로 Makefile이다.

    그래서 어떻게 헤더파일 포함시켜서 컴파일하는 데?

    $ls
    main.cpp sum.cpp sum.h
    
    $gcc -c -o main.o main.cpp
    $gcc -c -o sum.o sum.cpp
    
    $gcc -o main main.o sum.o
    $ls
    main main.o sum.o main.cpp sum.cpp sum.h

    위처럼 따라하게 되면 헤더파일을 포함시켜서 컴파일 시킬 수 있다.

    헤더파일은 사실 컴파일하거나 하지 않고, 각각 c코드들을 gcc -c 옵션으로 컴파일 시키고 난 다음, 마지막으로 한꺼번에 컴파일 시켜주면 된다.

    'Study > Tips' 카테고리의 다른 글

    gdb script....  (0) 2020.06.08
    irvine32.inc library 함수들 정리  (0) 2020.05.15
    어셈블리  (0) 2020.04.19
    tagMSG.message  (0) 2020.04.18
    IDA 로 파일 dump 하기  (0) 2020.04.06

    댓글