Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.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
C 如何在makefile中正确使用%或*(星号)符号作为占位符?_C_Makefile - Fatal编程技术网

C 如何在makefile中正确使用%或*(星号)符号作为占位符?

C 如何在makefile中正确使用%或*(星号)符号作为占位符?,c,makefile,C,Makefile,我在创建“上下文无关/文件名无关”makefile来构建C项目时遇到了一个问题,每次添加新文件时都没有指定显式的文件名。我有以下项目结构: include/ #dir to store all header files lib1.h lib2.h ... src/ # dir of source code obj/ #temporary dir for storing all .o files lib1.o lib2.o

我在创建“上下文无关/文件名无关”makefile来构建C项目时遇到了一个问题,每次添加新文件时都没有指定显式的文件名。我有以下项目结构:

include/ #dir to store all header files
    lib1.h
    lib2.h
    ...
src/ # dir of source code
    obj/ #temporary dir for storing all .o files
        lib1.o
        lib2.o
        ...
    lib1.c # start with #include "lib1.h"
    lib2.c # the same
    ...
    main.c
以及以下生成文件:

# dirs
IDIR=include
SDIR=src
ODIR=src/obj

_HEADS=*.h  #or maybe % percentage instead?
HEADS=$(patsubst %, $(IDIR)/%, $(_HEADS))
_OBJS=*.o
OBJS=$(patsubst %, $(ODIR)/%, $(_OBJS))
_CFILES=*.c
CFILES=$(patsubst %, $(SDIR)/%, $(_CFILES))

# compiler
GCC=gcc
CFLAGS=-I$(IDIR)

$(OBJS): $(CFILES) $(HEADS)
    $(GCC) -c -o $@ $< $(CFLAGS)

main: $(OBJS)
    $(GCC) -o $@ $^ $(CFLAGS)

规则
%.o
是如何写为规则名称的(我想如果它们都是普通名称而不是一些逻辑事物会更好)?或者,如果您在实际规则中使用像
%@
这样的占位符以避免额外的命名“开销”,那么这样做是有意义的。请解释一下,谁能帮我修复一下我的makefile?我真的把这些微妙的事情搞砸了…

*
是一个通配符,它可以给你一个列表,并且是“shell”关联的

%
是一个makefile内部通配符,它将以各种方式作为占位符(我将在下面解释)

虽然
*.c
可以在一个变量中获得所有c文件的列表,但您可以使用
%

%.o: %.c %.h
    gcc -o foo %@
例如,这被称为a和means,用于每个
.c
.h
生成目标
.o
,其下面有相应的配方

使用模式规则,make将生成如下内容

a.o : a.c a.h
    ...
b.o : b.c b.h
    ...
c.o : c.c c.h
    ...
您当前尝试执行的操作将导致int

a.o b.o c.o : a.c b.c c.c a.h b.h c.h 
    gcc ....
虽然这可能是有效的,但您有不必要的依赖关系<代码>a.o不需要依赖于
b.c
例如

另外,
\u CFILES=*.c
将导致“*.c”是变量中的字符串,而不是实际文件。如果要展开实际文件名,应使用函数

现在

也有类似placeholer的“for each”功能
%

%.o: %.c %.h
    gcc -o foo %@
这意味着每次有
%
时,它都将被
$(SDIR)/%
替换。因为您没有要匹配的
%
模式,尽管在中,这会变得很奇怪。你想在这里实现什么?如果您想从路径“剪切”
src
,则相反

CFILES=$(patsubst $(SRC)%, % , $(_CFILES))

但我怀疑你想这么做。您应该阅读一下makefile文档,这里链接了很多次。我解释了很多。

和C语言和C++语言是如何相关的?因为它可能是在C/C++项目中使用这种Mag文件的常见情况。它不是C++。而且C++还有很多其他的构建系统,不仅可以做。这就是makefile-tag-related你有没有试过打印变量的值,比如
HEADS
OBJS
,并检查它们是否包含你想要的内容?是的,你没有名为
*.h
的文件,所以它被认为是最新的。我已经给了你一些建议,告诉你该怎么做。如果您正在学习,那么打印变量并检查它们是否符合您的要求是很有帮助的。非常感谢!现在%占位符变得非常清晰。然而,我仍然在摸索如何创建文件名不可知的建筑(根据我在文章中提供的结构)。也许这不是一种“好”的构建方式,但我想知道——是否有可能(根本)编写makefile,这样每次在适当的文件夹中添加新的.c或.h文件时都不会失败?工具就在那里。要获取具有扩展名的所有文件,您可以使用
通配符
,并使用
模式规则
。顺便说一句,make已经为c/cpp文件预定义了模式规则,所以您甚至不需要声明它们。我为这些部分链接的手册中也有这样的例子。
CFILES=$(patsubst %, $(SDIR)/%, $(_CFILES))
CFILES=$(patsubst $(SRC)%, % , $(_CFILES))