0

我正在使用 GNU make 来编译我的 fortran 项目。在我的特殊情况下,我有两个静态库,每个库都有一个相关对象列表。我的 Makefile 包含:

LIB_BTMOD = btmod
LIB_btmod_OBJS = \
  m_bt_check \
  m_bt_execute

LIB_MDLMOD = mdlmod
LIB_mdlmod_OBJS = \
  m_model_set \
  m_model_run

之后,我想创建每个库

$(LIB_BTMOD) : $(LIB_btmod_OBJS:%=%.o)
  ar rc lib$(@).a $^

$(LIB_MDLMOD) : $(LIB_mdlmod_OBJS:%=%.o)
  ar rc lib$(@).a $^

这个解决方案对我来说似乎有点多余。如何仅将它与一个多个目标一起使用?

我的提议看起来像:

$(LIB_BTMOD) $(LIB_MDLMOD) : $(LIB_$(@)_OBJS:%=%.o)
  ar rc lib$(@).a $^

但这并没有按预期扩展先决条件。在这一点上我做错了什么?

非常感谢您的帮助。

此致

4

1 回答 1

0

做你想做的事情的方法是首先重新排列元素:

$(LIB_BTMOD) : $(LIB_btmod_OBJS:%=%.o)
$(LIB_MDLMOD) : $(LIB_mdlmod_OBJS:%=%.o)

$(LIB_BTMOD) $(LIB_MDLMOD) :
    ar rc lib$(@).a $^

然后重写先决条件行:

$(LIB_BTMOD) : $(addsuffix .o,$(LIB_btmod_OBJS))
$(LIB_MDLMOD) : $(addsuffix .o,$(LIB_mdlmod_OBJS))

然后尝试组合它们(并失败):

$(LIB_BTMOD) $(LIB_MDLMOD) : $(addsuffix .o,$(LIB_$(@)_OBJS))

然后记住二次扩展并正确使用语法:

.SECONDEXPANSION:

$(LIB_BTMOD) $(LIB_MDLMOD) : $$(addsuffix .o,$$(LIB_$$(@)_OBJS))
    ar rc lib$(@).a $^

也就是说,我认为你最好在.o构造对象列表时添加,而不是即时添加。

于 2021-03-03T17:47:00.000 回答