C++에서 Makefile 사용
이 기사에서는 C++에서 Makefile을 사용하는 방법에 대한 여러 방법을 보여줍니다.
Makefile을 사용하여 C++에서 쉽게 다중 파일 프로그램 컴파일
Makefile
은 컴파일 할 프로그램 소스 파일과 헤더 간의 관계를 설명하는 파일 이름입니다. 이 파일은 명령 줄에서 호출되는make
유틸리티에 의해 사용되며 코드 프로젝트를위한 미니 빌드 시스템 역할을합니다. 하지만make
는 프로그래밍 언어와 프로그램 컴파일에만 국한되지 않습니다. 상대 파일의 수정 사항에 따라 파일을 업데이트해야하는 시나리오에서 사용할 수 있기 때문입니다. 관계는 특정 조치를 설명하는 규칙 세트로 표시됩니다. 다음 스 니펫은 일반적인 규칙의 구조를 보여줍니다. target
은 일반적으로 실행 파일 또는 개체 파일의 이름입니다. prerequisites
은 일반적으로 대상 파일을 출력하는 데 필요한 입력 파일입니다. recipe
는 make
가 수행하는 작업으로, 새 줄마다 탭으로 들여 쓰기됩니다. make
는 현재 작업 디렉토리에있는 경우makefile
또는Makefile
이라는 파일을 스캔합니다.
target: prerequisites
recipe
규칙은 유일하게 필요한 부분이므로Makefile
의 주요 부분입니다. 다음 예제는program
이라는 실행 파일을 빌드하는 간단한Makefile
구조를 보여줍니다. 이제프로그램
에는 아래 규칙에서 출력되는 오브젝트 파일 인prerequisites
-main.o
및library1.o
가 있습니다. 둘 다 주어진 출력을 얻기 위해 특정 전제 조건을 컴파일하는 각각의 레시피가 있습니다. g++
명령은 레시피의 일부로 실행되는 GNU C++ 컴파일러이며 일반적인 명령 줄 인수로 구성 할 수 있습니다.
program : main.o library1.o
g++ -o program main.o library1.o
main.o : main.cpp header1.h
g++ -c main.cpp
library1.o : library1.cpp library1.h
g++ -c library1.cpp
Makefile
의 또 다른 기능은 C++ 전 처리기 매크로 표현식과 유사하게 작동하는 변수입니다. 즉, 파일에 여러 번 나타나는 문자열에 대한 이름 별칭을 정의하고 변수 이름을 배치 할 수 있습니다. 예를 들어, 다음 스 니펫은 파일 시작 부분에 정의 된OBJ
변수를 표시하며 첫 번째 규칙에서 반복되는program
전제 조건을 포함합니다. 그러나 변수는 훨씬 긴 문자열을 대체 할 때 가장 효율적입니다.
OBJ = main.o library1.o
program : $(OBJ)
g++ -o program $(OBJ)
main.o : main.cpp header1.h
g++ -c main.cpp
library1.o : library1.cpp library1.h
g++ -c library1.cpp
또한 일반적으로Makefile
의 여러 위치에서 사용되는 컴파일러 또는 링커 플래그를 나타낼 수있는 다른 변수를 정의 할 수 있습니다. 따라서 프로젝트가 크고Makefile
이 커지면 주어진 매개 변수의 모든 인스턴스를 변경하는 것보다 한 줄을 수정하는 것이 더 쉽습니다.
OBJ = main.o library1.o
CC = g++
LFLAGS = -lm
program : $(OBJ)
$(CC) -o $(LFLAGS) program $(OBJ)
main.o : main.cpp header1.h
$(CC) -c main.cpp
library1.o : library1.cpp library1.h
$(CC) -c library1.cpp
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook