Heim >Backend-Entwicklung >C++ >Kann GNU Make die Erstellung zahlreicher ausführbarer Dateien mit ähnlichen Regeln in einer Verzeichnisstruktur rationalisieren und die Kompilierung sowohl aus dem Hauptverzeichnis als auch aus einzelnen Projektordnern ermöglichen?

Kann GNU Make die Erstellung zahlreicher ausführbarer Dateien mit ähnlichen Regeln in einer Verzeichnisstruktur rationalisieren und die Kompilierung sowohl aus dem Hauptverzeichnis als auch aus einzelnen Projektordnern ermöglichen?

Linda Hamilton
Linda HamiltonOriginal
2024-10-27 16:07:02989Durchsuche

Can GNU Make streamline building numerous executables with similar rules across a directory structure, allowing compilation from both the main directory and individual project folders?

Erstellen mehrerer ausführbarer Dateien mit ähnlichen Regeln mit GNU Make

Frage:

Kann GNU Make das Erstellen mehrerer ausführbarer Dateien mit ähnlichen Regeln in einer Verzeichnisstruktur erleichtern und die Kompilierung sowohl aus dem Hauptverzeichnis als auch aus einzelnen Projektverzeichnissen ermöglichen?

Antwort:

Ja, GNU Make kann damit umgehen Bewältigen Sie diese Aufgabe mit einem prägnanten und effizienten Ansatz. Nachfolgend finden Sie zwei Makefiles, die die gewünschte Funktionalität implementieren:

project.mk:

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

Makefile:

# one directory per project, one executable per directory
project_dirs := $(shell find * -maxdepth 0 -type d )

# executables are named after its directory and go into the same directory
exes := $(foreach dir,${project_dirs},${dir}/${dir})

all : ${exes}

#  the 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 auto-generated dependency files
-include $(foreach dir,${project_dirs},$(wildcard ${dir}/*.d))

Verwendung:

  • Erstellen Sie in jedem Projektverzeichnis symbolische Links mit dem Namen Makefile zu project.mk.
  • Um ein bestimmtes Projekt zu erstellen, navigieren Sie zum Projektverzeichnis und führen Sie make aus.
  • Um alle Projekte zu erstellen, führen Sie make aus dem Hauptverzeichnis (all_lessons) aus.
  • Um ein bestimmtes Projekt zu bereinigen, führen Sie make clean aus dem Projektverzeichnis aus.
  • Um alle Projekte zu bereinigen, führen Sie make clean aus dem Hauptverzeichnis aus.

Vorteile:

  • Einfach zu implementieren und für die angegebenen Anforderungen geeignet.
  • Unterstützt das Erstellen und Bereinigen sowohl aus dem Hauptverzeichnis als auch aus Projektverzeichnissen.
  • Generiert automatisch Abhängigkeiten und ist vollständig parallelisierbar.

Das obige ist der detaillierte Inhalt vonKann GNU Make die Erstellung zahlreicher ausführbarer Dateien mit ähnlichen Regeln in einer Verzeichnisstruktur rationalisieren und die Kompilierung sowohl aus dem Hauptverzeichnis als auch aus einzelnen Projektordnern ermöglichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn