web-dev-qa-db-fra.com

Créer une bibliothèque exécutable et partagée avec un seul fichier

Utiliser les makefiles est nouveau pour moi. Mes premiers tests avec l'approche la plus simple ont très bien fonctionné jusqu'à présent. Mais maintenant, je me suis retrouvé en train d'écrire un fichier Make qui crée un fichier exécutable et une bibliothèque partagée. Comme je l'ai dit, je suis nouveau dans les makefiles. Voici mon approche simple:

exe.a: main.c func.c
    gcc main.c func.c -o exe.a
lib.so: func.c
    gcc func.c -o lib.so -fPIC -shared

Lorsque le fichier makefile est exécuté, seul l'exécutable sera compilé. Est-il même possible de créer deux objets avec un makefile? Quelle est la meilleure approche pour créer ces fichiers?

4
Olupo

Par défaut, makeconstruira uniquement la première cible dans un fichier Makefile qui est exe.a dans votre cas. Vous pouvez indiquer à makede créer une autre cible:

make lib.so

ou les deux cibles:

make lib.so exe.a

ou (préféré) introduisez un nouveau première cible qui est généralement nommé allname__:

all: exe.a lib.so

exe.a: main.c func.c
    gcc main.c func.c -o exe.a
lib.so: func.c
    gcc func.c -o lib.so -fPIC -shared

Désormais, un simple makeconstruira la (pseudo-) cible allqui dépend à son tour de exe.a et de lib.so, de sorte qu'ils sont générés en premier. Notez que vous ne devez pas, dans ce cas, avoir un fichier appelé allcar dans ce cas, makedevient confus.

5
PerlDuck