为什么我的简单makefile不起作用

时间:2016-09-08 23:09:27

标签: c gcc makefile

当我说非常简单时,我的意思是。我有一个main.c和一个名为input_error.h的头文件。

main.o : main.c input_error.h
    gcc -c main.c

当我运行命令“make”时,执行gcc -c main.c但它没有更新我对main.c文件所做的任何更改。当我手动输入“gcc main.c”时,它工作正常。

编辑:似乎我需要添加另一条规则,但我不确定是什么需要

2 个答案:

答案 0 :(得分:2)

目前你的makefile只构建.o文件。您可以通过两种方式构建二进制文件。请注意,make要求targets语句中的缩进是一个制表符而不是4个空格,因为它可能已被浏览器转换为。

分别构建.o然后链接二进制文件。请注意,使用-c开关会导致gcc仅构建目标文件。

main: main.o
    gcc main.o -o main

main.o : main.c input_error.h
    gcc -c main.c -o main.o

一步构建

main: main.c input_error.h
    gcc main.c -o main

您还可以通过使用特殊变量来表示目标($ @),第一个依赖项($<)和所有(@ ^)依赖项来避免makefile中的重复。

e.g。以上一行可能成为

main.o : main.c input_error.h
        gcc -c $< -o $@

一开始看起来有些神秘,但你会习惯它。 @kaylums答案中的隐含规则也有助于减少打字。

答案 1 :(得分:2)

Makefile只有一个规则来编译.o文件。也就是说,它没有任何规则来链接最终的可执行文件。

make具有构建许多共同目标的隐含规则。所以你的Makefile可以简单如下:

all: main

main.o : input_error.h

进一步说明:

  • all: main:由于这是第一个目标,因此如果没有向make命令行提供显式目标,则默认情况下将构建该目标。它取决于单个目标main
  • main没有明确的规则,但make有一个隐式规则,可以从main.c构建它。
  • main.o : input_error.h:告诉make main.o如果input_error.h发生变化,则需要重建main.c。由于make具有隐含的知识,因此无需将make放在此处。也不需要显式命令,因为 .floating-block{ position: fixed; top: 25%; right: 25%; width: 50%; border: 3px solid red; background-color:white; } 也有隐含的命令。