c makefile tutorial
이 C ++ Makefile 자습서에서는 C ++의 장점과 응용 프로그램을 포함하여 Make 도구 및 makefile의 주요 측면에 대해 설명합니다.
모든 C ++ 프로젝트에서 중요한 목표 중 하나는 프로젝트 빌드를 단순화하여 모든 종속성과 프로젝트 파일을 한곳에서 가져오고 한 번에 실행하여 단일 명령으로 원하는 출력을 얻을 수 있도록하는 것입니다.
테스터를위한 SQL 쿼리 인터뷰 질문
동시에 프로젝트 파일이 수정 될 때마다 전체 프로젝트를 다시 빌드해야하는 번거 로움을 겪을 필요가 없습니다. 즉, 프로젝트에서 파일이 한두 개 수정 될 때마다 변경된 파일 만 다시 빌드 한 다음 계속 진행합니다. 실행과 함께.
이것들은 정확히 C ++의 'make'도구와 'makefiles'에 의해 해결되는 기능입니다. 이 튜토리얼에서는 makefile의 모든 주요 측면과 C ++ 애플리케이션에 대해 설명합니다.
학습 내용 :
도구 만들기
Make는 UNIX 도구이며 프로젝트의 다른 모듈에서 실행 파일 빌드를 단순화하는 도구로 사용됩니다. makefile에서 대상 항목으로 지정된 다양한 규칙이 있습니다. make 도구는 이러한 모든 규칙을 읽고 그에 따라 동작합니다.
예를 들면 규칙이 종속성을 지정하는 경우 make 도구는 컴파일 목적으로 해당 종속성을 포함합니다. make 명령은 makefile에서 모듈을 빌드하거나 파일을 정리하는 데 사용됩니다.
make의 일반적인 구문은 다음과 같습니다.
%make target_label #target_label is a specific target in makefile
예를 들면 , rm 명령을 실행하여 파일을 정리하려면 다음과 같이 작성합니다.
% make clean # 여기서 clean은 rm 명령에 지정된 target_label입니다.
C ++ 메이크 파일
makefile은 대상을 빌드하기 위해‘make’명령에서 사용하거나 참조하는 텍스트 파일에 불과합니다. 메이크 파일에는 각 파일에 대한 소스 수준 종속성과 빌드 순서 종속성과 같은 정보도 포함되어 있습니다.
이제 makefile의 일반적인 구조를 살펴 보겠습니다.
makefile은 일반적으로 변수 선언으로 시작하고 특정 대상을 빌드하기위한 대상 항목 집합이 뒤 따릅니다. 이러한 대상은 .o 또는 C 또는 C ++의 기타 실행 파일 및 Java의 .class 파일 일 수 있습니다.
대상 레이블로 지정된 명령 집합을 실행하기위한 대상 항목 집합도 가질 수 있습니다.
따라서 일반적인 메이크 파일은 다음과 같습니다.
# comment target: dependency1 dependency2 ... dependencyn command # (note: the in the command line is necessary for make to work)
메이크 파일의 간단한 예는 아래와 같습니다.
# a build command to build myprogram executable from myprogram.o and mylib.lib all:myprogram.o mylib.o gcc –o myprogram myprogram.o mylib.o clean: $(RM) myprogram
위의 makefile에서는 두 개의 대상 레이블을 지정했습니다. 첫 번째는 myprogram 및 mylib 개체 파일에서 실행 파일을 빌드하기위한 레이블 'all'입니다. 두 번째 대상 레이블 'clean'은 이름이 'myprogram'인 모든 파일을 제거합니다.
makefile의 또 다른 변형을 살펴 보겠습니다.
# the compiler: gcc for C program, define as g++ for C++ CC = gcc # compiler flags: # -g - this flag adds debugging information to the executable file # -Wall - this flag is used to turn on most compiler warnings CFLAGS = -g -Wall # The build target TARGET = myprogram all: $(TARGET) $(TARGET): $(TARGET).c $(CC) $(CFLAGS) -o $(TARGET) $(TARGET).c clean: $(RM) $(TARGET)
위의 예에서 볼 수 있듯이이 메이크 파일에서는 사용중인 컴파일러 값 (이 경우 GCC)이 포함 된 변수 'CC'를 사용합니다. 또 다른 변수‘CFLAGS’에는 사용할 컴파일러 플래그가 포함되어 있습니다.
세 번째 변수 'TARGET'에는 실행 파일을 빌드하는 데 필요한 프로그램의 이름이 포함됩니다.
이 makefile 변형의 측정 이점은 컴파일러, 컴파일러 플래그 또는 실행 가능한 프로그램 이름이 변경 될 때마다 사용했던 변수의 값을 변경하면된다는 것입니다.
Make 및 Makefile의 예
다음 파일이있는 프로그램 예제를 고려하십시오.
- Main.cpp : 주요 드라이버 프로그램
- Point.h : 포인트 클래스의 헤더 파일
- Point.cpp : 포인트 클래스 용 CPP 구현 파일
- Square.h : 사각형 클래스 용 헤더 파일
- Square.cpp; 스퀘어 클래스 용 CPP 구현 파일
위에 제공된 .cpp 및 .h 파일을 사용하여 이러한 파일을 개별적으로 컴파일하여 .o 파일을 생성 한 다음 main이라는 실행 파일에 연결해야합니다.
다음으로이 파일을 개별적으로 컴파일합니다.
- g ++ -c main.cpp : main.o 생성
- g ++ -c 포인트 .cpp : point.o를 생성합니다.
- g ++ -c square.cpp : square.o 생성
다음으로 개체 파일을 함께 연결하여 실행 가능한 main을 생성합니다.
g ++ -o main main.o point.o square.o
다음으로 프로그램의 특정 부분이 업데이트 될 때 다시 컴파일하고 재생성해야하는 파일을 결정해야합니다. 이를 위해 우리는 종속성 차트 각 구현 파일에 대한 다양한 종속성을 보여줍니다.
아래는 위 파일에 대한 종속성 차트입니다.
따라서 위의 종속성 차트에서 루트에서 실행 가능한 'main'을 볼 수 있습니다. 실행 가능한‘main’은 개체 파일 즉, main.cpp, point.cpp 및 square.cpp를 각각 컴파일하여 생성되는 main.o, point.o, square.o.
모든 cpp 구현은 위 차트에 표시된대로 헤더 파일을 사용합니다. 위와 같이 main.cpp는 드라이버 프로그램이므로 point.h와 square.h를 모두 참조하고 point 및 square 클래스를 사용합니다.
다음 파일 point.cpp는 point.h를 참조합니다. 세 번째 파일 인 square.cpp는 square.h와 point.h를 참조합니다. 정사각형을 그리는 데에도 점이 필요하기 때문입니다.
위의 종속성 차트를 보면 .cpp 파일이 참조하는 .cpp 파일 또는 .h 파일이 변경 될 때마다 해당 .o 파일을 다시 생성해야합니다. 예를 들면 main.cpp가 변경되면 main.o를 다시 생성하고 개체 파일을 다시 연결하여 기본 실행 파일을 생성해야합니다.
위의 모든 설명은 프로젝트에 파일이 거의 없으면 원활하게 작동합니다. 프로젝트가 크고 파일이 너무 많으면 파일을 반복적으로 재생성하기가 어려워집니다.
따라서 우리는 파일을 만들고 프로젝트를 빌드하고 실행 파일을 생성하는 도구를 만드는 데 사용합니다.
우리는 이미 make 파일의 다양한 부분을 보았습니다. 파일 이름은 'MAKEFILE'또는 'makefile'이어야하며 소스 폴더에 있어야합니다.
이제 우리는 위의 예제를 위해 makefile을 기록 할 것입니다.
다음과 같이 컴파일러 및 컴파일러 플래그의 값을 보유하는 변수를 정의합니다.
CC = g++ CFLAGS = -wall -g
그런 다음 makefile에 첫 번째 대상, 즉 실행 가능한 main을 만듭니다. 그래서 우리는 의존성을 가진 타겟을 작성합니다.
메인 : main.o point.o square.o
따라서이 대상을 생성하는 명령은 다음과 같습니다.
$(CC) $(CFLAGS) –o main main.o point.o square.o
노트 : 위의 명령은 실제로 g ++ -wall –g –o main main.o point.o square.o로 변환됩니다.
다음 목표는 객체 파일 main.o, point.o, square.o를 생성하는 것입니다.
이제 main.o를 생성하기 위해 대상은 다음과 같이 작성됩니다.
Main.o: main.cpp point.h square.h
이 대상에 대한 명령은 다음과 같습니다.
$(CC) $(CFLAGS) –c main.cpp
다음 파일 point.o는 아래 명령을 사용하여 생성 할 수 있습니다.
$(CC) $(CFLAGS) –c point.h
위의 명령에서 point.cpp를 건너 뛰었습니다. 이는 make가 .cpp 파일에서 .o 파일이 생성된다는 것을 이미 알고 있기 때문에 .h (포함 파일)만으로 충분합니다.
마찬가지로 square.o는 다음 명령으로 생성 할 수 있습니다.
$(CC) $(CFLAGS) –c square.h point.h
이 예제의 전체 메이크 파일은 다음과 같습니다.
# Makefile for Writing Make Files Example # ***************************************************** # Variables to control Makefile operation CC = g++ CFLAGS = -Wall -g # **************************************************** # Targets needed to bring the executable up to date main: main.o Point.o Square.o $(CC) $(CFLAGS) -o main main.o Point.o Square.o # The main.o target can be written more simply main.o: main.cpp Point.h Square.h $(CC) $(CFLAGS) -c main.cpp Point.o: Point.h Square.o: Square.h Point.h
따라서 세 개의 C ++ 파일을 컴파일 한 다음 개체 파일에서 실행 가능한 메인을 생성하는 완전한 메이크 파일이 있음을 알 수 있습니다.
Makefile의 장점
- 대규모 프로젝트의 경우 makefile을 사용하면 프로젝트를 체계적이고 효율적인 방식으로 표현하는 데 도움이됩니다.
- Makefile은 소스 코드를보다 간결하고 읽기 및 디버그하기 쉽게 만듭니다.
- Makefile은 변경된 파일 만 자동으로 컴파일합니다. 따라서 프로젝트의 일부가 수정 될 때 전체 프로젝트를 다시 생성 할 필요가 없습니다.
- Make 도구를 사용하면 한 번에 여러 파일을 컴파일 할 수 있으므로 모든 파일을 한 번에 컴파일 할 수 있습니다.
결론
Makefile은 소프트웨어 개발에 큰 도움이됩니다. C ++ 메이크 파일을 사용하면 더 짧은 시간에 솔루션을 구축 할 수 있습니다. 또한 프로젝트의 일부가 수정되면 메이크 파일은 전체 프로젝트를 재생성 할 필요없이 해당 부분 만 다시 컴파일하고 재생성합니다.
C ++ Makefile을 사용하면 프로젝트를 체계적이고 효율적으로 표현할 수 있으므로 더 읽기 쉽고 디버그하기 쉽습니다.
이 C ++ Makefile 튜토리얼에서는 makefile과 make 도구를 자세히 살펴 보았습니다. 또한 처음부터 makefile을 작성하는 방법에 대해서도 논의했습니다.
=> 여기에서 완벽한 C ++ 교육 가이드를 확인하십시오.
추천 도서
- 무료로 C ++ 프로그래밍을 배우기위한 70 개 이상의 최고의 C ++ 자습서
- Dev C ++ IDE : 설치, 기능 및 C ++ 개발
- C ++의 전체 개요
- VBScript 파일 개체 : CopyFile, DeleteFile, OpenTextFile, 읽기 및 쓰기 텍스트 파일
- Python 파일 처리 자습서 : 생성, 열기, 읽기, 쓰기 방법
- Unix 파일 시스템 명령 Touch, Cat, Cp, Mv, Rm, Mkdir (파트 B)
- 2021 년 최고의 Python IDE 및 코드 편집기 12 가지
- 완벽한 코딩 경험을위한 최고의 15 가지 최고의 무료 코드 편집기