이는 make
대규모 프로젝트, 특히 설명된 것처럼 혼란스러운 종속성이 있는 경우에 유용하며 Makefile
작업 흐름에도 도움이 됩니다. make
소규모 프로젝트에 어떤 이점이 있는지 들어 본 적이 없습니다 . 그것을 가지고?
답변1
많은 사람들이 더 복잡한 makefile의 세부사항과 그에 수반되는 많은 복잡성을 연구하고 있습니다. 나는 일반적으로 완전히 다른 이유로 makefile을 사용합니다.
나는 아무것도 기억하고 싶지 않습니다.
프로젝트가 정말 지루하고 단순하고 makefile을 "올바르게" 사용하지 않더라도:
all:
gcc main.c -o project
나는 그것에 대해 생각하거나 더 복잡한 프로젝트와 다르게 취급할 필요가 없습니다.
all:
gcc libA.c libB.c main.c -o project2
또는 플래그(예 -O2
: )를 지정하면 해당 플래그가 무엇인지 기억할 필요가 없습니다.
또한 간단한 makefile로 시작하고 나중에 병합/리팩터링해야 하는 경우 각 프로젝트를 다르게 빌드하는 것을 기억할 필요가 없습니다.
답변2
무엇과 관련하여?
file1.c
.라는 이름 을 가진 두 개의 파일로 분할된 프로그램이 있다고 가정해 보겠습니다 file2.c
. 다음을 실행하여 프로그램을 컴파일할 수 있습니다.
cc file1.c file2.c -o yourprogram
하지만 이렇게 하려면 파일 하나만 변경되더라도 매번 두 파일을 모두 다시 컴파일해야 합니다. 컴파일 단계를 다음과 같이 나눌 수 있습니다.
cc -c file1.c
cc -c file2.c
cc file1.o file2.o -o yourprogram
그런 다음 파일 중 하나를 편집할 때 해당 파일을 다시 컴파일하면 됩니다(변경한 내용에 관계없이 연결 단계 수행). 하지만 파일을 편집한다면 어떨까요?그 다음엔 또 다른, 두 파일을 모두 편집하는 것을 잊어버리고 실수로 하나만 다시 컴파일했습니까?
게다가 파일이 2개만 있어도 명령어는 60자 정도 된다. 타이핑이 금방 지루해질 수 있습니다. 물론 스크립트에 넣을 수도 있지만 그러면 매번 다시 컴파일하게 됩니다. 또는 어떤 파일이 수정되었는지 확인하고 필요한 컴파일만 수행하는 매우 화려하고 복잡한 스크립트를 작성할 수도 있습니다. 내가 무슨 말을 하려는지 이해하나요?
답변3
소규모 프로젝트의 경우에도 종속성 논리를 제어하고 빌드를 자동화하는 것이 도움이 됩니다. 또한 설치 및 제거를 트리거하는 데 사용하므로 재설정 단계의 마스터 스위치입니다.
답변4
Makefile
내 아주 작은 프로젝트의 예:getPixelColor
이는 두 개의 선택적 매개변수인 좌표를 사용하여 이름에서 알 수 있는 것과 정확히 일치합니다.
나는 특히 그곳에서 사물이 서로 의존하는 방식을 좋아합니다.
COORDS ?= 0 0
CXX := g++-8
CXXFLAGS := -std=c++17 -Wall -Wextra -Werror -Wpedantic -pedantic-errors
LDLIBS := -lX11
RM := rm -f
BIN := getPixelColor
SRC := $(BIN).cpp
$(BIN): $(SRC)
$(CXX) $(CXXFLAGS) $(SRC) -o $(BIN) $(LDLIBS)
.PHONY: clean
clean:
$(RM) $(BIN)
.PHONY: run
run: $(BIN)
./$(BIN) $(COORDS)
보시다시피, 추가로 입력할 필요 없이 필요한 모든 작업을 수행합니다.
용법
다음을 통해 실행할 수 있습니다.
오래된 바이너리를 정리합니다:
make clean
새 바이너리를 컴파일합니다.
make
실행 파일을 실행하는 방법에는 두 가지가 있습니다.
기본 좌표 [0,0]
make run # equals COORDS='0 0'
어떤 주어진 좌표
COORDS='5 6' make run
Makefile은 때때로 매우 유용합니다. 프로젝트 규모가 클수록 혜택도 커집니다. 하지만 예제에서 볼 수 있듯이 가장 작은 C++ 프로젝트라도 많은 문제를 줄일 수 있습니다.