我的Makefile
包含以下内容:
CC=gcc
CFLAGS=-Wall
main: hello.o hello_fn.o
clean:
rm -f main hello.o hello_fn.o
它应该生成一个可执行文件main
(我在 Brian Gough 的《GCC 简介》中读过),但实际上并没有。
输出应该是这样的:
$ make
gcc -Wall -c -o hello.o main.c
gcc -Wall -c -o hello_fn.o hello_fn.c
gcc hello.o hello_fn.o -o main
但实际上是这样的:
$ make
gcc -Wall -c -o hello.o hello.c
gcc -Wall -c -o hello_fn.o hello_fn.c
当我$ make
再次输入时,它说'main' is up to date
。
当前目录下的文件:
$ ll
total 24
drwxr-xr-x 2 rodion rodion 4096 Oct 4 15:39 ./
drwxr-x--- 13 rodion rodion 4096 Oct 4 15:39 ../
-rw-r--r-- 1 rodion rodion 104 Oct 4 00:29 hello_fn.c
-rw-r--r-- 1 rodion rodion 31 Oct 4 00:21 hello.h
-rw-r--r-- 1 rodion rodion 84 Oct 4 00:28 main.c
-rw-r--r-- 1 rodion rodion 84 Oct 4 12:18 Makefile
make
版本:
$ make -v
GNU Make 4.3
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
所有文件的内容:
$ cat hello.c
#include "stdio.h"
#include "hello.h"
int main ()
{
hello ("world");
return 0;
}
$ cat hello_fn.c
#include <stdio.h>
#include "hello.h"
void hello (const char * name)
{
printf ("Hello %s\n", name);
}
$ cat hello.h
void hello(const char * name);
答案1
假设您指的是这个文件,第一个Makefile
与您的问题不太一样:
CC = gcc
CFLAGS = -Wall
main: main.o hello_fn.o
clean:
rm -f main main.o hello_fn.o
main
有main.o
并且hello_fn.o
作为先决条件,不hello.o
.修复产生工作Makefile
.
这依赖于一个GNU Make 中的内置规则,形式为
x: y.o z.o
期望x.c
存在(并且y.o
是z.o
可构建的)。因此,二进制目标的名称必须与.c
当前目录中的文件匹配。