首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在makefile中使用自动变量“$<”获取不同的依赖项值

无法在makefile中使用自动变量“$<”获取不同的依赖项值
EN

Stack Overflow用户
提问于 2015-05-10 05:30:14
回答 1查看 55关注 0票数 1

我正在做一次,它编译了一些我做的算法。

我有这样的结构:

代码语言:javascript
复制
    |/sorting_algorithms  
    |----/bin  
    |----/build  
    |----/include  
    |--------tiempo.h
    |----/src  
    |--------bubble_sort.c  
    |--------enhanced_bubble_sort.c  
    |--------selection_sort.c  
    |--------insertion_sort.c  
    |--------shellsort.c  
    |--------heapsort.c  
    |--------tiempo.c
    |----makefile

我的makefile是这样的:

代码语言:javascript
复制
    CC := gcc
    CFLAGS := -g -Wall
    SRCDIR := src
    BUILDDIR := build
    TARGETDIR := bin
    SRCEXT := c
    INC := -I include
    # need to create rhis object code,before binding code with objects to make the binaries
    TIME_CODE = tiempo.$(SRCEXT)
    TIME_OBJECT = $(BUILDDIR)/tiempo.o
    # get source list
    SOURCES := $(shell find $(SRCDIR) -type f -name *.$(SRCEXT))
    # create object list
    OBJECTS := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(SOURCES:.$(SRCEXT)=.o))
    # create target list
    TARGETS := $(patsubst $(BUILDDIR)/%,$(TARGETDIR)/%,$(OBJECTS:%.o=%))
    # it this is necesary?
    ALL: $(TIME_OBJECT) $(TARGETS)

    $(TIME_OBJECT):
        @mkdir -p $(BUILDDIR)
        $(CC) $(CFLAGS) $(SRCDIR)/$(TIME_CODE) -c $(INC) -o $(TIME_OBJECT)

    $(TARGETS): $(OBJECTS)
        @echo "$(CC) -o $@ $< $(TIME_OBJECT)"
        @$(CC) -o $@ $< $(TIME_OBJECT)

    $(BUILDDIR)/%.o: $(SRCDIR)/%.$(SRCEXT)
        @echo "$(CC) $(CFLAGS) $(INC) -c $< -o $@"
        @$(CC) $(CFLAGS) $(INC) -c $< -o $@

    clean:
        @echo "$(RM) -r $(BUILDDIR) $(TARGETDIR)/*"
        @$(RM) -r $(BUILDDIR) $(TARGETDIR)/*

    .PHONY: clean

我使用tiempo.h库来度量时间,这就是为什么我对所有的时间都使用它

因此,当我用它编译时,它正确地创建了目标代码,但是在创建二进制文件时,自动变量'$<‘只给出了一个值,即“build/冒泡_sort.o”,因此它创建了相同的二进制文件,但是具有不同的名称,下面是输出:

代码语言:javascript
复制
    gcc -g -Wall src/tiempo.c -c -I include -o build/tiempo.o
    gcc -g -Wall -I include -c src/bubble_sort.c -o build/bubble_sort.o
    gcc -g -Wall -I include -c src/enhanced_bubble_sort.c -o build/enhanced_bubble_sort.o
    gcc -g -Wall -I include -c src/heapsort.c -o build/heapsort.o
    gcc -g -Wall -I include -c src/insertion_sort.c -o build/insertion_sort.o
    gcc -g -Wall -I include -c src/selection_sort.c -o build/selection_sort.o
    gcc -g -Wall -I include -c src/shellsort.c -o build/shellsort.o
    gcc -o bin/bubble_sort build/bubble_sort.o build/tiempo.o
    gcc -o bin/enhanced_bubble_sort build/bubble_sort.o build/tiempo.o
    gcc -o bin/heapsort build/bubble_sort.o build/tiempo.o
    gcc -o bin/insertion_sort build/bubble_sort.o build/tiempo.o
    gcc -o bin/selection_sort build/bubble_sort.o build/tiempo.o
    gcc -o bin/shellsort build/bubble_sort.o build/tiempo.o
    gcc -o bin/tiempo build/bubble_sort.o build/tiempo.o

此外,如果你能给我一些技巧来构建makefile,良好的实践,或者告诉我,我可以做什么来提高性能,我将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-10 05:49:33

未正确指定二进制目标的规则。它告诉我们,所有的二进制文件都依赖于所有的对象,这是不对的。

而且,$<是第一个依赖项。这就是为什么在命令中包含第一个对象文件来构建每个二进制文件的原因。

您可以使用$^,它代表所有依赖项。

而不是:

代码语言:javascript
复制
$(TARGETS): $(OBJECTS)
    @echo "$(CC) -o $@ $< $(TIME_OBJECT)"
    @$(CC) -o $@ $< $(TIME_OBJECT)

使用:

代码语言:javascript
复制
${TARGETDIR}/% : ${BUILDDIR}/%.o ${TIME_OBJECT}
    @$(CC) -o $@ $^
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30148067

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档