Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.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
在Makefile中使用后缀规则_Makefile - Fatal编程技术网

在Makefile中使用后缀规则

在Makefile中使用后缀规则,makefile,Makefile,假设有a.c,b.c,c.c,tt/at.c,tt/bt.c,fff/af.c,fff/bf.c。所以我把Makefile做成这样: OBJS=a.o b.o c.o SRCS=$(OBJS:.o=.cc) OBJS_TT=at.o bt.o SRCS_TT=tt/at.c tt/bt.c OBJS_FFF=af.o bf.o SRCS_FFF=fff/af.c fff/bf.c TARGET=test .cc.o: gcc -c $< $(OBJS_TT):

假设有a.c,b.c,c.c,tt/at.c,tt/bt.c,fff/af.c,fff/bf.c。所以我把Makefile做成这样:

OBJS=a.o b.o c.o
SRCS=$(OBJS:.o=.cc)

OBJS_TT=at.o bt.o
SRCS_TT=tt/at.c tt/bt.c

OBJS_FFF=af.o bf.o
SRCS_FFF=fff/af.c fff/bf.c

TARGET=test

.cc.o:
     gcc -c $<

$(OBJS_TT):
     gcc -c $(SRCS_TT)

$(OBJS_FFF):
     gcc -c $(SRCS_FFF)

all:
     gcc -o $(TARGET) $(OBJS) $(OBJS_TT) $(OBJS_FFF)
OBJS=a.o b.o c.o
SRCS=$(OBJS:.o=.cc)
OBJS_TT=at.o bt.o
SRCS_TT=TT/at.c TT/bt.c
OBJS_FFF=af.o bf.o
SRCS_FFF=FFF/af.c FFF/bf.c
目标=测试
.cc.o:
gcc-c$<
美元(OBJS_TT):
gcc-c$(SRCS\U TT)
美元(OBJS_FFF):
gcc-c$(SRCS\U FFF)
全部:
gcc-o$(目标)$(OBJS)$(OBJS_TT)$(OBJS_FFF)
如果tt目录中的C文件被添加,我必须在SRCS_tt&OBJS_tt中添加文件名。 有没有改进make文件的方法?
如何使用后缀规则处理所有c文件(包括目录中的文件)?

当源文件位于不同目录中时,一个常见的解决方案是在生成目录中构建同构的目录结构。通过这种方式,您可以拥有多个具有相同文件名(例如,
util.cc
)但位于不同目录中的源,并且对象文件不会发生冲突,因为它们构建在不同的目录中

创建同构构建目录结构(也具有自动生成的头依赖项)的工作示例:

build_dir := build

all : ${build_dir}/test

.SECONDEXPANSION:
.SECONDARY:

test_srcs := a.cc b.cc x/c.cc y/d.cc
${build_dir}/test : ${test_srcs:%.cc=${build_dir}/%.o} | ${build_dir}/
    g++ -o $@ ${LDFLAGS} ${LDLIBS} $^
# Include the auto-generated dependencies.
-include ${test_srcs:%.cc=${build_dir}/%.d}

# Compile and generate dependency files.
${build_dir}/%.o : %.cc | $$(dir $$@)
    g++ -o $@ -c -MD -MP ${CPPFLAGS} ${CXXFLAGS} $<

# Directory build rules. while loop to handle races on mkdir during parallel builds.
${build_dir}/%/ : | ${build_dir}/
    while ! mkdir -p $@; do true; done

# Build root directory rule.
${build_dir}/ :
    mkdir -p $@

 # Don't try to rebuild these, these are generated when compiling.
${build_dir}/%.d : ;

clean :
    rm -rf ${build_dir}

.PHONY : all clean

你能澄清一下你想在哪里创建“.o”吗?后缀规则将对象放在“tt/”和“fff/”中。直接规则将对象保留在当前目录中
$ mkdir x y

$ touch b.cc x/c.cc y/d.cc

$ echo "int main() {}" > a.cc

$ make
mkdir -p build/
g++ -o build/a.o -c -MD -MP   a.cc
g++ -o build/b.o -c -MD -MP   b.cc
while ! mkdir -p build/x/; do true; done
g++ -o build/x/c.o -c -MD -MP   x/c.cc
while ! mkdir -p build/y/; do true; done
g++ -o build/y/d.o -c -MD -MP   y/d.cc
g++ -o build/test   build/a.o build/b.o build/x/c.o build/y/d.o

$ tree build/
build/
├── a.d
├── a.o
├── b.d
├── b.o
├── test
├── x
│   ├── c.d
│   └── c.o
└── y
    ├── d.d
    └── d.o

2 directories, 9 files

$ make
make: Nothing to be done for 'all'.

$ make clean
rm -rf build