2009-05-19 20 views
5

Ich habe ein Makefile nur geschrieben, um eine gemeinsame Bibliothek, ähnlich wie die folgenden bauen:Makefile für freigegebene Bibliotheken?

libmystuff.so: CFLAGS+=-fPIC -shared 
libmystuff.so: libmystuff.o otherstuff.o 
    $(CC) $(CFLAGS) -o [email protected] $^ 

Ich mag tun explizite Aktionen zu vermeiden, wenn dies wie eine gemeinsame Operation scheint, aber es scheint, gibt es keine implizite Regel ist oder andere Einbauten, um dies zu standardisieren. Ich benutze momentan GNU Make unter Linux, muss aber auch unter OS X arbeiten.

BEARBEITEN: Ich frage nach make Regeln statt Compiler/Linker Flags.

Können Sie saubere, wiederverwendbare Makefile-Regeln zum Erstellen von gemeinsam genutzten Bibliotheken empfehlen? Vielleicht eine %.so: oder .c.so: Art Regel?

Antwort

9

Für Portabilität, würde ich in aussehen libtool integrieren.

define compile_rule 
     libtool --mode=compile \ 
     $(CC) $(CFLAGS) $(CPPFLAGS) -c $< 
endef 
define link_rule 
     libtool --mode=link \ 
     $(CC) $(LDFLAGS) -o [email protected] $^ $(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 [email protected]) $(libdir)/$(notdir [email protected]) 
install: $(addprefix install/,$(LIBS)) 
     libtool --mode=finish $(libdir) 

libtool automatisch -fPIC/-DPIC/-shared Flaggen entsprechend hinzufügen und erzeugen, was .o/.a/.so Dateien auf der aktuellen Plattform verwendet werden würde.

Oder Sie könnten Automake 's Libtool Integration verwenden.

+0

Libtool scheint der beste Weg zu sein. Es ist eine Schande, dass das Handbuch Sie zu den Wölfen wirft (siehe http://www.gnu.org/software/libtool/manual/libtool.html#Makefile-rules), wenn Sie nicht die gesamte Autotools-Suite verwenden. – dwc

5

Der Aufbau gemeinsamer Bibliotheken ist plattformabhängig. Die von Ihnen verwendeten Flags sind beispielsweise OK für GCC für ELF-Plattformen, für Cygwin beispielsweise nicht -fPIC, für einige andere Plattformen und Compiler benötigen Sie andere Flags.

Sie müssen eines der folgenden:

  • eine Option, um Flags für Benutzerplattform einzustellen.
  • Verwenden Sie Standard-Build-System wie Autotools
+0

Mir geht es gut mit pro Plattformflaggen. Ich frage wirklich nach Regeln. Siehe bearbeitete Frage, danke. – dwc

+0

dwc, die Aufgabe, plattformübergreifende Flags zu schreiben, wurde erledigt. Es heißt Autotools. Ich verspreche Ihnen, es wird tausendmal leichter sein als das, was Sie zu tun scheinen (was aussieht, als würden Sie Ihre eigenen Autotools von Grund auf neu erstellen). –