Makefile을 이용한 컴파일은 어떨 때 사용하나요?

프로그래밍을 하다 보면 Makefile이나 CMake를 이용해서 구현을 해놓은 SDK들이 많은데, 왜 header와 c파일 두 개로 나누어 놓지 않고, 1개의 header와 여러개의 c 파일을 만들고 이를 링킹하는 방식으로 만드는지 잘 모르겠습니다. 제가 지금까지 경험했던 프로그래밍 방식 내에선, header inclusion으로 전부 해결되었었거든요… 그리고 Make를 쓸 경우 다른 개발환경에 라이브러리를 적용하기도 쉽지 않고요.

1 Like

여러 관점이 있을 것 같아서 지극히 개인적인 사용자 입장에서 말씀드리자면,

  1. 파일을 나누는 이유: 파일이 너무 길어지면 나중에 필요한 부분을 찾기 힘드니까 대충 찾기 쉽게 묶어놓습니다.

  2. Make를 쓰는 이유: 여러 파일을 빌드하거나, 뭔가 복잡한 설정을 해줘야 하는 경우 어딘가에 빌드하는 방법을 메모해놓고 나중에 붙이곤 합니다. 더블 클릭하면 실행되는 메모가 쉘 스크립트입니다. (정의와는 상당히 차이가 있지만 이런 용도로 사용 가능하다 정도입니다)

그런데 파일이 여러 개 있다보니까 어떤 파일 하나만 수정하고 다시 빌드하면, 전체를 다시 빌드하는게 아니라 해당되는 파일이랑 관련 오브젝트 파일을 빌드하고, 링크만 다시 해주면, 파일이 많아질수록 속도가 상대적으로 빨라집니다.

쉘스크립트로 “A파일이 바뀌었으면 A를 오브젝트 파일로 만들고 링커를 호출해서 최종 파일을 만들어라”라는 것을, 말 그대로 한 줄 한 줄 짤 수는 있지만, Makefile에서는 꽤 짧게 가능합니다. 의존되는 파일들을 관리하는 데 특화된 도구인거죠.

a.exe: a.o
gcc a.o -o a
a.o: a.c a.h
gcc a.c -o a.o

여기서 C/C++ 등 C관련 언어에 특화된 것이 CMake인데요, 의존성을 알아서 다 파악해줍니다.

add_executable(a a.c a.h)

Makefile들은 보통 GNU Make, gmake라는 프로그램용으로 작성되는데, 다른 os보다 리눅스/유닉스 기반 시스템에서 많이 쓰이고, CMake는 예전에도 많은 os에서 지원되었지만, 요새 Visual Studio도 기본적으로 잘 지원할 만큼 윈도 지원도 쭉쭉 성장하는 것 같아요. 저는 요즘 CMake 위주로 쓰고 있습니다.

이외에도 각 언어별로 특화되거나, 혹은 보다 범용적인 빌드 시스템들이 있습니다. Visual Studio에서 쓰는 솔루션/프로젝트도 그 중 하나입니다.

안녕하세요.

여러개의 소스코드 파일을 다뤄야할때 make를 쓰죵.

컴파일 인자나, 링커 인자를 변수로 정의해서 사용해서 컴파일 설정을 관리하기도 편하구요.

배포할 때, 의존성을 체크하거나 설치하는 스크립트를 넣어놓을 수도 있구요