6

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

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

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

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

你能推荐干净、可重用的 Makefile 规则来构建共享库吗?也许是%.so:.c.so:类型规则?

4

2 回答 2

10

为了便携性,我会考虑集成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.so

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

于 2009-05-20T16:46:37.417 回答
6

构建共享库依赖于平台。例如,您使用的标志对于 ELF 平台的 GCC 是可以的,对于 cygwin,例如,对于需要其他标志的某些其他平台和编译器,您不需要添加 -fPIC。

您需要以下之一:

  • 提供为用户平台设置标志的选项。
  • 使用标准构建系统,如 Autotools
于 2009-05-20T12:00:26.557 回答