【问题标题】:reuse the same rules for building different targets重复使用相同的规则来构建不同的目标
【发布时间】:2015-12-30 19:40:20
【问题描述】:

我正在开发一个包含多个静态库的项目。我构建它们的方式总是相同的。我想知道如何为所有库重用这些规则,并避免为每个库进行复制和粘贴。这是一个构建 'foo' 库的示例。

# inputs
#
FOO_LIB_NAME  := libfoo.a
FOO_SRC_DIR   := $(SRC_DIR)/foo
FOO_SRC_FILES := \
        foo_file1.cc                              \
        subdir/foo_file2.cc                       \
        subdir/foo_file3.cc                       \
        ...
FOO_CFLAGS    :=

# rules
#
FOO_SRC_FILES := $(addprefix $(FOO_SRC_DIR)/,$(FOO_SRC_FILES))
FOO_OBJ_FILES := $(subst .cc,.o,$(FOO_SRC_FILES))

$(FOO_LIB_NAME): $(FOO_OBJ_FILES)
        $(AR) rc $@ $^

$(FOO_OBJ_FILES): %.o: %.cc
        $(CXX) $(COMMON_CFLAGS) $(FOO_CFLAGS) $< -o $@

此外,如果您对前面的代码摘录有任何意见,我很高兴知道。我对编写 Makefile 很陌生。

提前致谢

【问题讨论】:

标签: c++ makefile


【解决方案1】:

您可以使用模板和 Make 中的eval 函数来完成此操作。 GNU Make Manualthe section on eval 中有示例

这是手册中的示例:

PROGRAMS    = server client

server_OBJS = server.o server_priv.o server_access.o
server_LIBS = priv protocol

client_OBJS = client.o client_api.o client_mem.o
client_LIBS = protocol

# Everything after this is generic

.PHONY: all
all: $(PROGRAMS)

define PROGRAM_template =
 $(1): $$($(1)_OBJS) $$($(1)_LIBS:%=-l%)
 ALL_OBJS   += $$($(1)_OBJS)
endef

$(foreach prog,$(PROGRAMS),$(eval $(call PROGRAM_template,$(prog))))

$(PROGRAMS):
        $(LINK.o) $^ $(LDLIBS) -o $@

clean:
        rm -f $(ALL_OBJS) $(PROGRAMS)

【讨论】:

  • 谢谢,我想这就是我要找的结构 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-13
  • 2013-12-27
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
  • 2018-01-10
  • 1970-01-01
相关资源
最近更新 更多