{"id":21,"date":"2008-02-24T16:22:45","date_gmt":"2008-02-24T15:22:45","guid":{"rendered":"http:\/\/linux.leunen.com\/?p=21"},"modified":"2008-03-15T10:35:19","modified_gmt":"2008-03-15T09:35:19","slug":"makefile-generique","status":"publish","type":"post","link":"https:\/\/www.leunen.com\/linux\/2008\/02\/makefile-generique\/","title":{"rendered":"C++ &#8211; Makefile g\u00e9n\u00e9rique"},"content":{"rendered":"<p>Voil\u00e0, vous avez pris un peu d&rsquo;assurance, vous commencez \u00e0 diviser votre code en plusieurs unit\u00e9s (ce qui est une bonne pratique) et vous avez plusieurs fichiers \u00e0 compiler et \u00e0 lier ensemble pour en faire une application. Inconv\u00e9nient, la ligne de commande \u00e0 taper au clavier dans une console devient beaucoup trop longue et impossible \u00e0 g\u00e9rer surtout si en plus vous utilisez quelques librairies. La solution est d&rsquo;utiliser un fichier appel\u00e9 makefile. Un   makefile regroupe toutes les directives n\u00e9cessaires au compilateur et au lieur pour cr\u00e9er votre ex\u00e9cutable.<\/p>\n<p>Je vous propose ci-dessous un makefile g\u00e9n\u00e9rique qui devrait fonctionner dans la plupart des cas:<\/p>\n<pre class=\"codesource\">CC = g++\r\nCFLAGS = -Wall\r\nEXEC_NAME = nom_de_votre_ex\u00e9cutable\r\nINCLUDES =\r\nLIBS =\r\nOBJ_FILES = fichier_1.o fichier_2.o\r\nINSTALL_DIR = \/usr\/bin\r\n\r\n<strong>all<\/strong> : $(EXEC_NAME)\r\n\r\n<strong>clean<\/strong> :\r\n  rm $(EXEC_NAME) $(OBJ_FILES)\r\n\r\n$(EXEC_NAME) : $(OBJ_FILES)\r\n  $(CC) -o $(EXEC_NAME) $(OBJ_FILES) $(LIBS)\r\n\r\n%.o: %.cpp\r\n  $(CC) $(CFLAGS) $(INCLUDES) -o $@ -c $&lt;\r\n\r\n%.o: %.cc\r\n  $(CC) $(CFLAGS) $(INCLUDES) -o $@ -c $&lt;\r\n\r\n%.o: %.c\r\n  gcc $(CFLAGS) $(INCLUDES) -o $@ -c $&lt;\r\n\r\n<strong>install<\/strong> :\r\n  cp $(EXEC_NAME) $(INSTALL_DIR)<\/pre>\n<p>Voyons comment vous pouvez customiser ce makefile pour qu&rsquo;il s&rsquo;adapte \u00e0 vos besoins.<\/p>\n<p><em>CC=<\/em> le compilateur que vous utiliser. Ici, c&rsquo;est <em>g++<\/em> mais \u00e7a pourrait \u00eatre un autre.<\/p>\n<p><em>CFLAGS =<\/em> les options \u00e0 passer au compilateur. Dans ce cas-ci, <em>-Wall<\/em> active tous les warnings.<\/p>\n<p><em>EXEC_NAME =<\/em> le nom de l&rsquo;ex\u00e9cutable que vous d\u00e9sirez.<\/p>\n<p><em>INCLUDES =<\/em> le chemin vers les fichiers header n\u00e9cessaire \u00e0 la compilation. Par exemple, si vous utilisez la <em>glib2<\/em>, vous \u00e9crirez<br \/>\n<em>INCLUDES = -I\/usr\/include\/glib-2.0 -I\/usr\/lib\/glib-2.0\/include<\/em><br \/>\nNotez le switch <em>-I<\/em> devant le chemin.<\/p>\n<p><em>LIBS =<\/em> le chemin vers les librairies que vous utilisez. Par exemple dans le cas de la glib2  <em>LIBS =  -lglib-2.0<\/em> Le switch est <em>-l<\/em>. Si vous devez ajoutez une librairie statique et non plus un chemin vous ajoutez cette librairie avec son chemin directement. Pour reprendre notre exemple et y ajouter la librairie statique <em>\/usr\/lib\/libgpod.so<\/em>, vous le faites sur la m\u00eame ligne et sans switch: <em>LIBS = \/usr\/lib\/libgpod.so -lglib-2.0<\/em><\/p>\n<p><em>OBJ_FILES =<\/em> la liste des fichiers objets que vous devez obtenir.<\/p>\n<p><em>all : $(EXEC_NAME)<\/em> est ce qui va \u00eatre appel\u00e9 par make lorsque vous taper <em>$ make<\/em> dans une console.<\/p>\n<p><em>clean :<\/em> appel\u00e9 par make lorsque vous taper <em>$ make clean<\/em> dans une console. Ici, cela delete les fichiers <em>.o<\/em> du r\u00e9pertoire.<\/p>\n<p><em>install :<\/em> appel\u00e9 par make lorsque vous taper <em>$ make install<\/em> dans une console. Ici, cela copie l&rsquo;ex\u00e9cutable dans le r\u00e9pertoire INSTALL_DIR qui dvrait se trouver dans le path.<\/p>\n<p>Le reste sont des directives pour le compilateur et le lieur leur disant quoi faire en pr\u00e9sence d&rsquo;un fichier .cpp, .cc ou .c<\/p>\n<p><strong> ATTENTION:<\/strong> les lignes qui sont indent\u00e9es le sont au moyen d&rsquo;un caract\u00e8re TAB et non pas d&rsquo;espaces. C&rsquo;est important.<\/p>\n<p>Si vous utilisez <em>Geany<\/em>, L&rsquo;option <em>Make All<\/em> dans le menu <em>Construire<\/em> appelle <em>make<\/em> et lance le <em>all:<\/em> de votre makefile.<\/p>\n<p>Autre avantage des makefiles, seuls les fichiers modifi\u00e9s ont besoin d&rsquo;\u00eatre recompil\u00e9s. <em>Make<\/em> examine automatiquement les fichiers, d\u00e9termine ceux qui doivent \u00eatre recompil\u00e9s, lance le compilateur et s&rsquo;il y a lieu le lieur (<em>linker<\/em>). C&rsquo;est une vrai facilit\u00e9 et un r\u00e9el gain de temps pour le programmeur.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Voil\u00e0, vous avez pris un peu d&rsquo;assurance, vous commencez \u00e0 diviser votre code en plusieurs unit\u00e9s (ce qui est une bonne pratique) et vous avez plusieurs fichiers \u00e0 compiler et \u00e0 lier ensemble pour en faire une application. Inconv\u00e9nient, la ligne de commande \u00e0 taper au clavier dans une console devient beaucoup trop longue et [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[4],"tags":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/21"}],"collection":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/comments?post=21"}],"version-history":[{"count":0,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/21\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/media?parent=21"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/categories?post=21"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/tags?post=21"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}