共享库的Makefile?

时间:2009-05-19 23:01:22

标签: linux macos makefile shared-libraries

我刚刚编写了一个Makefile来构建一个共享库,类似于以下内容:

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

我喜欢避免在这看起来像一个常见的操作时执行显式操作,但似乎没有隐式规则或其他内置函数来标准化它。我目前正在Linux上使用GNU Make,但是它也需要在OS X上运行。

编辑:我问的是make规则而不是编译器/链接器标志。

您能否建议使用干净,可重用的Makefile规则来构建共享库?可能是%.so:.c.so:类型规则?

2 个答案:

答案 0 :(得分:9)

为了便于携带,我会考虑整合libtool

define compile_rule
        libtool --mode=compile \
        $(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会自动添加-fPIC / -DPIC / -shared个标记,并生成.o / .a / {{1文件将在当前平台上使用。

或者您可以使用Automake的libtool集成。

答案 1 :(得分:5)

构建共享库取决于平台。例如,您正在使用的标志是 对于ELF平台的GCC,对于cygwin,例如,你没有为其他平台和编译器添加-fPIC,你需要其他标志。

您需要以下其中一项:

  • 提供为用户平台设置标志的选项。
  • 使用Autotools等标准构建系统