Makefile pour les bibliothèques partagées?

Je viens d’écrire un Makefile pour construire une bibliothèque partagée, similaire à la suivante:

libmystuff.so: CFLAGS+=-fPIC -shared libmystuff.so: libmystuff.o otherstuff.o $(CC) $(CFLAGS) -o $@ $^ 

J’aime éviter de faire des actions explicites lorsque cela semble être une opération courante, mais il semble qu’il n’y ait pas de règle implicite ou d’autres fonctions intégrées pour normaliser cela. J’utilise GNU Make sous Linux pour le moment, mais j’aurai aussi besoin de ça pour travailler sur OS X.

EDIT : Je pose des questions sur les règles de création plutôt que sur les drapeaux du compilateur / éditeur de liens.

Pouvez-vous recommander des règles de Makefile propres et réutilisables pour créer des bibliothèques partagées? Peut-être une règle de type %.so: ou .c.so:

Pour la portabilité, j’examinerai l’intégration de libtool .

 define comstack_rule libtool --mode=comstack \ $(CC) $(CFLAGS) $(CPPFLAGS) -c $< endef define link_rule libtool --mode=link \ $(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS) endef LIBS = libmystuff.la libmystuff_OBJS = libmystuff.lo otherstuff.lo %.lo: %.c $(call compile_rule) libmystuff.la: $(libmystuff_OBJS) $(call link_rule) install/%.la: %.la libtool --mode=install \ install -c $(notdir $@) $(libdir)/$(notdir $@) install: $(addprefix install/,$(LIBS)) libtool --mode=finish $(libdir) 

libtool appenda automatiquement les -fPIC / -fPIC / -DPIC selon le cas, et générera tous les fichiers .o / .a / .so qui seraient utilisés sur la plate-forme actuelle.

Ou vous pouvez utiliser l'intégration libtool d' Automake .

La création de bibliothèques partagées dépend de la plate-forme. Par exemple, les indicateurs que vous utilisez sont corrects pour les plates-formes GCC pour ELF, pour cygwin, par exemple, vous n’ajoutez pas -fPIC pour d’autres plates-formes et compilateurs pour lesquels vous avez besoin d’autres indicateurs.

Vous avez besoin de l’un des:

  • Fournir une option pour définir des indicateurs pour la plate-forme utilisateur.
  • Utiliser un système de construction standard comme Autotools