【问题标题】:Construct LDFLAGS from list of full library paths in Makefile从 Makefile 中的完整库路径列表构造 LDFLAGS
【发布时间】:2019-03-28 20:58:55
【问题描述】:

我想从具有完整路径的库列表中构造我的链接器标志LDFLAGS。这就是我被卡住的地方/原因。 (库名称是 Linux 风格的,但我认为这对于如何解决这个问题并不重要。)

FULL_LIBS = \
    ./path1/libone.a \
    ../../path2/libtwo.a
# etc.    

LIB_DIRS = $(dir $(FULL_LIBS))
LIB_NAMES = $(basename $(notdir $(FULL_LIBS)))
LIB_NAMES_TRIMMED = # zzz trim leading "lib" somehow??? This is what I don't know how to do, or at least the best way

LDFLAGS += \
    $(addprefix -L, $(LIB_DIRS)) \
    $(addprefix -l, $(LIB_NAMES_TRIMMED))

想要的结果,如果不是很明显,应该是这样的

LDFLAGS += -L./path1 -L../../path2 -lone -ltwo

不确定我是否需要正则表达式(或sed/awk/grep),所以我暂时保留该标签()。

【问题讨论】:

  • 不确定我的-L/-l 排序是否正确,因为我记得我记得它一定是按特定顺序排列的,但别担心,我自己可能会解决这个问题。

标签: regex makefile


【解决方案1】:

您可以使用 make (https://www.gnu.org/software/make/manual/html_node/Text-Functions.html#Text-Functions) 的文本处理功能:

LIB_NAMES_TRIMMED = $(subst lib,,$(LIB_NAMES))

虽然如果字符串“lib”出现在库名称的其他位置,这可能会失败。为避免这种情况,我们可以使用 2 个步骤:

LIB_NAMES_TRIMMED = $(basename $(notdir $(subst /lib,/,$(FULL_LIBS))))

正如 Matt 所解释的,使用 patsubst 更简单:

LIB_NAMES_TRIMMED = $(patsubst lib%,%,$(LIB_NAMES))

【讨论】:

  • 只要$(patsubst lib%,%,$(LIB_NAMES))就够了。
  • 哦,对了,subst 是我不记得是否存在类似的东西。非常适合简单的查找替换。我想一定有比sed...更简单的方法!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-11
  • 2013-12-20
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
相关资源
最近更新 更多