Mon makefile ne m'obéit pas

Le problème exposé dans ce sujet a été résolu.

Bon dimanche les gens. Je suis face à un mystère dont je ne parviens pas à trouver la solution en demandant à mes moteurs de recherche préférés, donc je me tourne vers vous.

J'ai un tout petit projet de bibliothèque partagée en C++, donc le code source est composé en tout et pour tout de deux fichiers : « signal.hpp » et « signal.cpp ». Lorsque j'entre les deux commandes suivantes dans mon terminal, la compilation et l'édition de lien se passent à merveille, no problemo.

1
2
g++ -O2 -std=c++14 -Wall -Werror -c -fPIC -o signal.o signal.cpp
g++ -O2 -std=c++14 -shared -Wl,-soname,libsignal.so.1 -o libsignal.so.1.0 signal.o

Il n'y a donc aucun problème avec le code lui-même. Je me décide donc à faire un makefile (avec GNU make 3.81), qui contient le code suivant.

1
2
3
4
5
6
7
VERSION=1.0

libsignal : signal.o
    g++ -O2 -std=c++14 -shared -Wl,-soname,libsignal.so.1 -o libsignal.so.$(VERSION) signal.o

signal.o : signal.cpp signal.hpp
    g++ -O2 -std=c++14 -Wall -Werror -c -fPIC -o signal.o signal.cpp

Comme vous le voyez, strictement les mêmes commandes. Mais là, j'ai plein d'erreur liées à l'utilisation de fonctionnalités de C++11, parce que la commande qu'exécute réellement make, c'est celle-ci (copiée-collée depuis mon terminal).

1
g++    -c -o signal.o signal.cpp

Déjà, c'est surprenant qu'il ne prenne pas en compte les commandes que je lui donne, mais passons… Suivant un conseil trouvé sur StackOverflow, j'ai légèrement modifié le makefile pour obtenir le résultat suivant.

1
2
3
4
5
6
7
8
export CXXFLAGS=-O2 -std=c++14 -Wall -Werror -fPIC
VERSION=1.0

libsignal : signal.o
    g++ -O2 -std=c++14 -shared -Wl,-soname,libsignal.so.1 -o libsignal.so.$(VERSION) signal.o

signal.o : signal.cpp signal.hpp
    g++ -O2 -std=c++14 -Wall -Werror -c -fPIC -o signal.o signal.cpp

Là, plus d'erreur, la commande exécutée est la bonne… sauf que libsignal n'est jamais exécutée et que la compilation en reste donc aux fichiers objets !

Voilà où j'en suis, totalement désemparé qu'un makefile censément aussi basique ne fonctionne pas. Du coup, si vous avez une idée de d'où ça peut venir, je suis preneur…

+1 -0

Salut,

C'est effectivement assez étrange : la commande make semble recourir à ses règles par défaut pour créer le fichier signal.o (d'où le fait que la définition de la variable CXX règle le soucis des options de compilation), comme si aucune règle ne lui était fournie pour cela…

Peux-tu me donner le contenu du dossier de compilation ainsi que le retour de la commande suivante ?

1
$ sed -n l makefile

Sinon, juste pour dire, n'oublie pas qu'une cible est par défaut considérée comme un nom de fichier par la commande make. Aussi, en l'état, la cible libsignal sera recréer à chaque appel puisqu'aucun fichier de ce nom n'est crée.

+0 -0

Je prends bonne note de ta remarque sur libsignal.

Voici le résultat d'un ls -l dans le dossier.

1
2
3
4
5
total 20
-rw-r--r-- 1 carnufex carnufex  353 nov.   8 13:00 Makefile
-rw-r--r-- 1 carnufex carnufex 4829 nov.   7 12:21 signal.cpp
-rw-r--r-- 1 carnufex carnufex 1700 nov.   7 13:23 signal.hpp
-rw-r--r-- 1 carnufex carnufex  170 nov.   7 00:17 test.cpp

Et celui de la commande que tu as demandé.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
export CXXFLAGS=-O2 -std=c++14 -Wall -Werror -fPIC$
VERSION=1.0$
$
libsignal : signal.o$
    g++ -O2 -std=c++14 -shared -Wl,-soname,libsignal.so.1 -o libsigna\
l.so.$(VERSION) signal.o$
$
signal.o : signal.cpp signal.hpp$
    g++ -O2 -std=c++14 -Wall -Werror -c -fPIC -o signal.o signal.cpp$
$
clean:$
\t@rm -rf *.o$
$
mrproper: clean$
\t@rm -rf libsignal.so.$(VERSION)$

Et… OK, j'ai compris ce qui plante : j'ai configuré gedit pour que la touche tabulation insère 4 espaces, et il lui faut de vraies tabulations. Une fois les vraies tabulations mises en place, ça fonctionne sans souci et sans besoin de définir CXXFLAGS.

'Foiré…

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte