2009-05-19 3 views
5

Я просто написал Makefile, чтобы построить общую библиотеку, аналогичную следующей:Makefile для общих библиотек?

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

Я хотел бы избежать делать явные действия, когда это кажется общей операции, но, кажется, нет неявного правила или другие встроенные модули для стандартизации. На данный момент я использую GNU Make на Linux, но для этого также потребуется работать и с OS X.

EDIT: Я прошу о создании правил, а не флагов компилятора/компоновщика.

Можете ли вы рекомендовать чистые, многоразовые правила Makefile для создания общих библиотек? Возможно, правило %.so: или .c.so:?

ответ

9

Для переносимости, я бы искать в интеграции 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 автоматически добавит -fPIC/-DPIC/-shared флагов в зависимости от обстоятельств, а также создавать любые .o/.a/.so файлов будет использоваться на текущей платформе.

Или вы можете использовать интеграцию libtool Automake.

+0

libtool кажется лучшим способом. Жаль, что руководство бросает вас волкам (см. Http://www.gnu.org/software/libtool/manual/libtool.html#Makefile-rules), если вы не используете весь комплект Autotools. – dwc

5

Создание общих библиотек зависит от платформы. Например, используемые вами флаги: ok для GCC для платформ ELF, для cygwin, например, вы не добавляете -fPIC для некоторых других платформ и компиляторов, вам нужны другие флаги.

Вам нужно один из:

  • Обеспечить возможность установить флаги для пользователя платформы.
  • Используйте стандартную систему сборки, как Autotools
+0

Я в порядке с флагами платформы. Я действительно спрашиваю о правилах. См. Отредактированный вопрос, спасибо. – dwc

+0

dwc, была выполнена работа по написанию флажков на платформе. Это называется Autotools. Я обещаю вам, что это будет в тысячу раз легче, чем то, что вы, похоже, хотите сделать (это похоже на создание собственного Autotools с нуля). –

Смежные вопросы