繁体   English   中英

Makefile第一个规则目标

[英]Makefile first rule target

我正在尝试仅使用三个文件来学习make

foo.h

#ifndef __foo_H_
#define __foo_H_

void print();

#endif

foo.c

#include <stdio.h>
#include "foo.h"


void print()
{
    printf("Hello World !");
}

main.c

#include "foo.h"

int main()
{
    print();
    return 0;
}

当我使用以下makefile时,一切运行正常

生成文件

CC = gcc
CFLAGS = -I.
DEPS = foo.h
OBJ = foo.o main.o 

.PHONY: clean

main: $(OBJ)
        gcc -o $@ $^ $(CFLAGS)

%.o: %.c $(DEPS)
        $(CC) -c -o $@ $< $(CFLAGS)

clean:
        rm *.o

上面的工作是因为默认情况下make运行第一个目标(我基本上在任何地方都读过它)。

如果我使用下面的makefile

CC = gcc
CFLAGS = -I.
DEPS = foo.h
OBJ = foo.o main.o 

.PHONY: clean

clean:
        rm *.o

main: $(OBJ)
        gcc -o $@ $^ $(CFLAGS)

%.o: %.c $(DEPS)
        $(CC) -c -o $@ $< $(CFLAGS)

在上面的makefile上调用make只会make clean因为默认情况下make运行第一条规则。

问题在于这个makefile

CC = gcc
CFLAGS = -I.
DEPS = foo.h
OBJ = foo.o main.o 

.PHONY: clean

%.o: %.c $(DEPS)
        $(CC) -c -o $@ $< $(CFLAGS)

main: $(OBJ)
        gcc -o $@ $^ $(CFLAGS)

clean:
        rm *.o

在上面的makefile中使用make我得到

gcc -c -o foo.o foo.c -I.
gcc -c -o main.o main.c -I.
gcc -o main foo.o main.o -I.

为什么不make刚刚建立.o文件和停止,因为它是第一个目标,为什么它去建立主呢? 我在第一条规则中没有指定要构建main的位置。

“第一个目标”规则仅计算显式目标。 它不计算隐式目标,例如后缀规则或模式规则。

考虑:如何确定应该构建.o文件? 应该建立哪些.o文件? 如何理解应该将其构建在变量OBJ ,而不是其他变量中?

我一直在寻找手册的一个很好的部分来指向您,但没有找到任何具体和具体的使用方法。 据我所知,问题的答案是模式规则不是目标,默认目标必须如其名称所示是目标。

如果您使用静态模式规则(它确实定义了目标),那么您的期望几乎是正确的,因为make在这种情况下会选择第一个此类文件并进行构建(并非所有都只是第一个)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM