Makefile,宏修饰符

Posted

技术标签:

【中文标题】Makefile,宏修饰符【英文标题】:Makefile, macro modifiers 【发布时间】:2013-11-13 19:25:43 【问题描述】:

我对编写 make 文件比较陌生,可以使用一些指针。我想要实现的可能是相当基本的,但在搜索网络后我无法理解如何实现。

我想将 src 目录中的一组目标文件编译到构建目录中,我天真的想法是将源文件集定义为宏,使用宏修饰符为目标文件创建一个宏(所以这些在重新编译时与源文件进行了适当的比较。我当前创建目标文件宏的方案如下:

SRCDIR = /some/dir/
BUILDDIR = /some/dir/
CSRC = \
        $(SRCDIR)f1.c \
        $(SRCDIR)f2.c \

OSRC = $(CSRC,.c=.o,F,<$(BUILDDIR))

all:
    @echo $(OSRC)

简单地放入所有规则以检查目标文件宏是否设置正确。不幸的是,它不是,而是空的。更换

OSRC = $(CSRC,.c=.o,F,<$(BUILDDIR))

通过

OSRC = $(CSRC:.c=.o)

确实给了我一个目标文件的宏,但没有正确的目录。因此,对于如何修改我的文件以获得我想要的东西的见解将不胜感激。 (我使用的是 GNU Make 3.82)

【问题讨论】:

【参考方案1】:

我不确定你从哪里得到$(CSRC,.c=.o,F,&lt;$(BUILDDIR));在 GNU make 中甚至没有任何类似的语法。

语句$(CSRC:.c=.o) 将所有.c 后缀替换为.o,但这对您没有帮助,因为您还想替换目录。

你应该使用$(patsubst ...)函数:

OSRC = $(patsubst $(SRCDIR)%.c,$(BUILDDIR)%.o,$(CSRC))

【讨论】:

是的,你是正确的,在第二次查看我得到语法的主页后,我意识到这不是 GNU make 语法而是 Opus Make,抱歉我的困惑并感谢使用正确的语法GNU。

以上是关于Makefile,宏修饰符的主要内容,如果未能解决你的问题,请参考以下文章

什么是修饰符?它有什么作用?举例说明

Java的类,方法,变量等等的默认修饰符是啥

Java_修饰符详解

java9-5 修饰符

Java中的修饰符

c#类的修饰符都有哪些?