make 命令不产生任何可执行文件

make 命令不产生任何可执行文件

我的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

mainmain.o并且hello_fn.o作为先决条件,不hello.o.修复产生工作Makefile.

这依赖于一个GNU Make 中的内置规则,形式为

x: y.o z.o

期望x.c存在(并且y.oz.o可构建的)。因此,二进制目标的名称必须与.c当前目录中的文件匹配。

相关内容