>백엔드 개발 >C++ >GNU Make를 사용하여 유사한 규칙으로 여러 실행 파일을 빌드하는 방법은 무엇입니까?

GNU Make를 사용하여 유사한 규칙으로 여러 실행 파일을 빌드하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-28 14:56:02937검색

 How to Build Multiple Executables with Similar Rules Using GNU Make?

GNU Make를 사용하여 유사한 규칙으로 여러 실행 파일 빌드

Scons는 유능한 빌드 도구이지만 원하는 기능을 구현하는 것은 어려울 수 있습니다. 보다 간단한 접근 방식은 최상위 및 개별 프로젝트 디렉토리 모두에서 쉽게 빌드하고 정리할 수 있는 GNU Make를 활용하는 것입니다.

Makefile 설정

제공되는 makefile all_lessons 디렉터리와 개별 프로젝트 디렉터리 모두에서 빌드 및 정리를 활성화합니다. 각 프로젝트의 실행 파일 이름은 해당 디렉터리에 따라 지정됩니다.

프로젝트 구조

이를 달성하려면 제공된 예와 유사한 프로젝트 구조를 설정해야 합니다.

all_lessons/
    helloworld/
        lesson.cpp
        main.cpp
    even_or_odd/
        lesson.cpp
        main.cpp
    calculator/
        lesson.cpp
        user_created_add.cpp
        main.cpp

Makefile 내용

project.mk

all :
% : forward_ # build any target by forwarding to the main makefile
    $(MAKE) -C .. project_dirs=$(notdir ${CURDIR}) $@
.PHONY : forward_

Makefile

# project configuration

project_dirs := $(shell find * -maxdepth 0 -type d )
exes := $(foreach dir,${project_dirs},${dir}/${dir})

all : ${exes}

# rules

.SECONDEXPANSION:
objects = $(patsubst %.cpp,%.o,$(wildcard $(dir )*.cpp))

# link
${exes} : % : $$(call objects,$$*) Makefile
    g++ -o $@ $(filter-out Makefile,$^) ${LDFLAGS} ${LDLIBS}

# compile .o and generate dependencies
%.o : %.cpp Makefile
    g++ -c -o $@ -Wall -Wextra ${CPPFLAGS} ${CXXFLAGS} -MD -MP -MF ${@:.o=.d} $<

.PHONY: clean
clean :
    rm -f $(foreach exe,${exes},$(call objects,${exe})) $(foreach dir,${project_dirs},$(wildcard ${dir}/*.d)) ${exes}

# include dependency files
-include $(foreach dir,${project_dirs},$(wildcard ${dir}/*.d))

사용

개별 프로젝트 디렉토리에서 빌드

[project_directory]$ ln -s ../project.mk Makefile  # create a symlink
[project_directory]$ make

최상위 디렉토리에서 빌드

[all_lessons]$ make

개별 프로젝트 디렉토리 정리

[project_directory]$ cd ..
[all_lessons]$ make clean

모든 프로젝트 정리

[all_lessons]$ make clean

위 내용은 GNU Make를 사용하여 유사한 규칙으로 여러 실행 파일을 빌드하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.