Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 共享库的Makefile?_Linux_Macos_Makefile_Shared Libraries - Fatal编程技术网

Linux 共享库的Makefile?

Linux 共享库的Makefile?,linux,macos,makefile,shared-libraries,Linux,Macos,Makefile,Shared Libraries,我刚刚编写了一个Makefile来构建一个共享库,如下所示: libmystuff.so: CFLAGS+=-fPIC -shared libmystuff.so: libmystuff.o otherstuff.o $(CC) $(CFLAGS) -o $@ $^ 当这看起来像是一个普通操作时,我喜欢避免执行显式操作,但似乎没有隐式规则或其他内置规则来标准化这一操作。目前我正在Linux上使用GNU Make,但在OSX上也需要它 编辑:我问的是生成规则,而不是编译器/链接器标志 您

我刚刚编写了一个Makefile来构建一个共享库,如下所示:

libmystuff.so: CFLAGS+=-fPIC -shared
libmystuff.so: libmystuff.o otherstuff.o
    $(CC) $(CFLAGS) -o $@ $^
当这看起来像是一个普通操作时,我喜欢避免执行显式操作,但似乎没有隐式规则或其他内置规则来标准化这一操作。目前我正在Linux上使用GNU Make,但在OSX上也需要它

编辑:我问的是生成规则,而不是编译器/链接器标志


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

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

您需要一个:

  • 提供为用户平台设置标志的选项
  • 使用标准构建系统,如自动工具

    • 为了便于携带,我会考虑集成

      定义编译规则
      libtool--mode=compile\
      $(CC)$(CFLAGS)$(CPPFLAGS)-c$<
      恩德夫
      定义链接规则
      libtool--mode=link\
      $(CC)$(LDFLAGS)-o$@$^$(LDLIBS)
      恩德夫
      LIBS=libmystuff.la
      libmystuff_OBJS=libmystuff.lo otherstuff.lo
      %.lo:%.c
      $(调用编译规则)
      libmystuff.la:$(libmystuff_OBJS)
      $(调用链接规则)
      安装/%.la:%.la
      libtool--mode=install\
      安装-c$(notdir$@)$(libdir)/$(notdir$@)
      安装:$(addprefix安装/,$(LIBS))
      libtool--mode=finish$(libdir)
      
      libtool
      将根据需要自动添加
      -fPIC
      /
      -DPIC
      /
      -shared
      标志,并生成任何
      .o
      /
      .a
      /
      。因此将在当前平台上使用
      文件


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

      我可以使用每个平台的标志。我真的在问关于制定规则的问题。请参阅编辑的问题Thank.dwc,编写每个平台标志的工作已经完成。这叫做自动工具。我向你保证,这将比你想做的事情容易一千倍(这看起来像是从头开始构建你自己的自动工具)。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)