目标'all'的配方在Ubuntu 15.10 64位上失败

时间:2016-02-05 20:41:07

标签: c linux ubuntu gcc makefile

1)如果我通过gcc -o ./file1 someArgs ./file2 someArgs在终端上输入每个命令,然后make

,则程序可以正常工作

2)如果我输入终端,也可以:make rst和make res

3)无法正常工作,在终端

中输入all: check default: check clean: rm -rf file1 file2 rst: gcc -o file1 file1.c && gcc file2.c -lm -o file2 res: ./file1 someArgs ./file2 someArgs check: make clean make rst make res

生成文件:

all:
    check

default:
    check

clean:
    rm -rf file1 file2

rst:
    gcc -o file1 file1.c && gcc file2.c -lm -o file2

res:
    ./file1 someArgs ./file2 someArgs

check:
    clean
    rst
    res

也尝试过:

make

有或没有make: check: Command not found Makefile:2: recipe for target 'all' failed make: *** [all] Error 127 的其他一些组合。所有相同的错误:

SslSelectChannelConnector

2 个答案:

答案 0 :(得分:2)

您似乎在制作规则的先决条件及其配方之间存在一些混淆。先决条件与目标名称在同一行;配方在下一个标签缩进的一行或多行上。因此,例如,这条规则......

all:
    check

...说目标'所有'没有先决条件(所以它总是被认为是过时的),并且构建它的方法是运行命令 check。你真正想要的是建立一个名为' check'的目标,你可以通过检查'来实现这个目标。所有'

的先决条件
all: check

更一般地说,您似乎正在接近makefile,就好像它是一个带有多个入口点的程序,但它更好地被视为make可以使用的一组规则建造东西。因此,实际构建文件以将构建文件指定为目标的规则是常规和期望的。此外,要使用make的全部功能,您应该为这些规则和其他规则表达适当的先决条件。例如:

./file1: file1.c
    gcc -o file1 file1.c

./file2: file2.c
    gcc file2.c -lm -o file2

res: ./file1 ./file2
    ./file1 someArgs ./file2 someArgs

如果你做得正确,那么你不需要每次都删除和重建程序这样的黑客攻击 - make会弄清楚它们是否已经过时,并且会在有时候重建它们它需要做。

答案 1 :(得分:1)

第一个目标all正在尝试运行名为check的命令(目标default也是如此)。我认为您希望命令make的行为与命令make check相同,并在Makefile中执行名为check的目标的操作。在这种情况下,将其添加为依赖项,如下所示:

all: check

default: check

clean:
    rm -rf file1 file2

rst:
    gcc -o file1 file1.c && gcc file2.c -lm -o file2

res:
    ./file1 someArgs ./file2 someArgs

check:
    make clean
    make rst
    make res