2009-05-19 23 views
5

acabo de escribir un Makefile para construir una biblioteca compartida, similar a la siguiente:Makefile para bibliotecas compartidas?

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

me gustaría evitar hacer acciones explícitas cuando esto parece una operación común, pero parece que no hay ninguna regla implícita o otros incorporados para estandarizar esto. Estoy usando GNU Make en Linux en este momento, pero también necesitaré esto para trabajar en OS X.

EDIT: Estoy preguntando acerca de las reglas de fabricación en lugar de las banderas de compilador/enlazador.

¿Puede recomendar reglas de Makefile limpias y reutilizables para compilar libs compartidas? Tal vez una regla de tipo %.so: o .c.so:?

Respuesta

9

Para la portabilidad, me vería en la integración de libtool.

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 añadirá automáticamente -fPIC/-DPIC/-shared banderas en su caso, y generar lo .o/.a/.so archivos se utiliza en la plataforma actual.

O podría usar la integración libtool de Automake.

+0

libtool parece ser la mejor manera. Es una pena que el manual te arroje a los lobos (mira http://www.gnu.org/software/libtool/manual/libtool.html#Makefile-rules) a menos que estés usando todo el conjunto de Autotools. – dwc

5

La construcción de bibliotecas compartidas depende de la plataforma. Por ejemplo, las banderas que está usando son , está bien para GCC para plataformas ELF, para cygwin, por ejemplo, no agrega -fPIC para otras plataformas y compiladores que necesita otros indicadores.

necesita uno de:

  • proporciona una opción para establecer indicadores para la plataforma de usuario.
  • Uso sistema de construcción estándar como Autotools
+0

Estoy bien con las banderas por plataforma. Realmente estoy preguntando sobre hacer reglas. Ver la pregunta editada, gracias. – dwc

+0

dwc, el trabajo de escribir banderas por plataforma se ha hecho. Se llama Autotools. Te prometo que será mil veces más fácil que lo que pareces querer hacer (que parece construir tus propias Autotools desde cero). –

Cuestiones relacionadas