리눅스에서 C 코드 컴파일하기, make 사용 방법

양말·2023년 3월 24일
0

시스템프로그래밍

목록 보기
4/7
post-thumbnail

익숙해지기


helloWorld!를 출력하는 간단한 C 코드 파일을 만들어 두었다. 파일 이름은 a.c이다.

C 코드 컴파일러는 gcc이다.

gcc a.c

는 실패했다!
gcc를 설치하라고 나온다.
리눅스 처음 배울 땐 되게 어렵고 난해했는데.. 지금 보니까 꽤나 친절한 것 같기도 하다. 나와 있는 대로 다음 명령어를 실행했다.

sudo apt install gcc

엥.. 빨간색은 불안하다
맨 밑에 보니 update가 있어서 apt를 update 해주기로 한다!

sudo apt update

그러고 다시 gcc를 설치해 주니 이렇게 잘 컴파일 돼서 a.out이 생긴 걸 볼 수 있다!

근데 여기서 궁금해진 점이 있는데
이상하게 그냥 a, a.out을 하면 실행이 안 되고.. ./a.out을 하면 실행이 된다.
다음주에 교수님께 여쭤보기로 하고 helloWorld! 뒤에 줄바꿈이 없어 이상하니 고쳐준다.

창 색 변경 유지가 안돼서 그냥 글자 크기를 키우는 걸로 했다.
블로그 가독성이라도 살린다.


make 사용해보기


간단한 C 코드 파일을 만들어 준다. 여긴 함수만 만들었다.
전혀 유용하지 않은 놈이지만 일단 중요한 건 make를 성공적으로 사용하는 거니까 거기에 집중한다.
파일 이름은 b.c이다.

b.c를 만드는 동안 여러가지 오류들을 만났다 ㅎㅎ
C에는 없는 bool이랑 true 썼다가.. #include를 썼다가..
알고보니 그냥 함수만 깔끔하게 적으면 되는 것이었다.

makefile이라는 이름의 파일을 만들어 준다.
makefile은 꼭 TAB키로 들여쓰기를 해 주어야 한다.

    OBJS = b.o
    MAIN = a.o
    //사실 MAIN을 선언할 필요가 없는데 교수님은 구분을 해 놓으셨길래
    
    all : $(OBJS) $(MAIN)
    //변수라고 생각하면 된다. 각각 b.o와 a.o가 들어간다.
    
		gcc -o test $(OBJS) $(MAIN)
		@echo "gcc is completed..."
        //@가 붙으면 해당 라인은 화면으로 출력되지 않는다.
        
    clean :
    	rm -f $(OBJS) $(MAIN)
        //object 파일을 모두 지운다.
        
    .c.o :
    	gcc -c $<
        //object 파일(여기선 대상인 a.o, b.o)이 없으면 만들어 주는 역할을 한다.

make도 설치해준다!

sudo apt install make

이제 makefile이 있는 경로에서 make를 실행하면 자동으로 makefile을 실행한다. ls를 하니 test 파일이 생성된 걸 확인할 수 있다. (a.out파일은 아까 전에 gcc a.c로 생성된 실행파일이다.)

gcc -o test b.o a.o

사진 네번째 줄의 여기가 b.o, a.o로 test라는 이름의 실행파일을 만들으라는 구문이다.
이건 리눅스 bash에서도 동일하게 입력하면 실행이 된다.

즉 make 파일 안에는 bash 명령어가 들어간다.

다른 이름의 특정 파일(예를 들어 makefile_hello)을 make로 실행하고 싶다면

make -f makefile_hello

이렇게 사용해야 한다.
따로 지정하지 않으면 'makefile' 이라는 이름의 파일을 자동으로 실행한다.

make clean

makefile 안에 clean : 부분을 실행하게 된다. 보다 시피 a.o, b.o 파일만 사라진 것을 알 수 있다.

	clean :
    	rm -f $(OBJS) $(MAIN)

make를 사용해서 실행파일을 만들어야 하는 이유는?


a.c 파일을 수정했다. hahaha도 출력이 된다.

수정된 시간을 확인해 보자.
a.o는 19:18에 만들어졌는데, a.c는 방금 수정을 해서 09:19에 만들어진 것이나 다름이 없다.

이것은 충분히 문제가 된다!

a.c(source파일) ---컴파일---> a.o(object파일) ---링크---> a.out(실행파일)

컴파일 과정이 시간 순으로 이러하다.
그러니 당연히 a.c가 a.o보다 먼저 만들어져야 실행파일에 문제가 생기지 않는다.

지금 상황은 수정된 부분을 업데이트 할 필요가 있는 것이다.
이 상태로 test를 이렇게 실행하면

./test

아까 추가한 hahaha는 출력이 되지 않는다.

make는 이러한 수정 사항을 감지하여 수정된 경우에는 새롭게 a.o 파일을 생성하고 link하여 실행파일을 다시 만들어 준다.

파일 시간을 확인해 보면 a.o와 test가 09:19로 새롭게 만들어졌음을 확인할 수 있다. 반면 b.o는 변경된 사항이 없으므로 (b.c가 더 먼저 만들어졌으므로) 그대로다.

makefile에서 @의 역할


6번째 라인의 echo 앞에 있던 @를 빼 보겠다.

아까는 echo "gcc is completed..."가 나오지 않았다.
echo는 echo 뒷 내용을 화면에 출력해 주는 역할을 한다. 그러니 echo 명령 자체는 출력 되지 않아야 중복 출력을 막을 수 있으니 @를 붙여 준다.

(아까 출력!)

화이팅!


리눅스랑 점점 친해지고 있어서 기분이 좋다.
vi 편집기는 아직도 어색해서 방향키에 자동으로 손이 가지만....!

그리고 글을 참 두서 없이 쓰는 것 같다.

profile
코끼리

0개의 댓글