Maison >développement back-end >C++ >Comment créer plusieurs exécutables avec des règles similaires à l'aide de GNU Make ?

Comment créer plusieurs exécutables avec des règles similaires à l'aide de GNU Make ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-28 14:56:02942parcourir

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

Création de plusieurs exécutables avec des règles similaires à l'aide de GNU Make

Bien que Scons soit un outil de construction performant, la mise en œuvre de la fonctionnalité souhaitée peut s'avérer difficile. Une approche plus simple consiste à utiliser GNU Make, qui permet une création et un nettoyage faciles à partir des répertoires de projet de niveau supérieur et individuels.

Configuration du Makefile

Les makefiles fournis activer la construction et le nettoyage à partir du répertoire all_lessons et des répertoires de projets individuels. L'exécutable de chaque projet porte le nom de son répertoire.

Structure du projet

Pour y parvenir, vous devrez mettre en place une structure de projet similaire à l'exemple fourni :

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

Contenu du 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))

Utilisation

Création à partir de répertoires de projets individuels

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

Création à partir du répertoire de niveau supérieur

[all_lessons]$ make

Nettoyage des répertoires de projets individuels

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

Nettoyage de tous les projets

[all_lessons]$ make clean

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn