C++에서 Makefile 사용

Jinku Hu 2021년5월13일
C++에서 Makefile 사용

이 기사에서는 C++에서 Makefile을 사용하는 방법에 대한 여러 방법을 보여줍니다.

Makefile을 사용하여 C++에서 쉽게 다중 파일 프로그램 컴파일

Makefile은 컴파일 할 프로그램 소스 파일과 헤더 간의 관계를 설명하는 파일 이름입니다. 이 파일은 명령 줄에서 호출되는make 유틸리티에 의해 사용되며 코드 프로젝트를위한 미니 빌드 시스템 역할을합니다. 하지만make는 프로그래밍 언어와 프로그램 컴파일에만 국한되지 않습니다. 상대 파일의 수정 사항에 따라 파일을 업데이트해야하는 시나리오에서 사용할 수 있기 때문입니다. 관계는 특정 조치를 설명하는 규칙 세트로 표시됩니다. 다음 스 니펫은 일반적인 규칙의 구조를 보여줍니다. target은 일반적으로 실행 파일 또는 개체 파일의 이름입니다. prerequisites은 일반적으로 대상 파일을 출력하는 데 필요한 입력 파일입니다. recipemake가 수행하는 작업으로, 새 줄마다 탭으로 들여 쓰기됩니다. make는 현재 작업 디렉토리에있는 경우makefile 또는Makefile이라는 파일을 스캔합니다.

target: prerequisites
	recipe

규칙은 유일하게 필요한 부분이므로Makefile의 주요 부분입니다. 다음 예제는program이라는 실행 파일을 빌드하는 간단한Makefile구조를 보여줍니다. 이제프로그램에는 아래 규칙에서 출력되는 오브젝트 파일 인prerequisites-main.olibrary1.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
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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