为什么隐式make规则不起作用?

时间:2019-02-03 15:55:01

标签: c makefile

我有一个源文件asd.c,并且出于某些原因,用于编译和链接此文件的内置规则不起作用。

这是我的超级简单的makefile:

asd.exe: asd.o

我遇到以下错误

cc    -c -o asd.o asd.c
process_begin: CreateProcess(NULL, cc -c -o asd.o asd.c, ...) failed.
make (e=2): The system cannot find the file specified.
<builtin>: recipe for target 'asd.o' failed
mingw32-make: *** [asd.o] Error 2

2 个答案:

答案 0 :(得分:3)

多种可能性:

  • 包含makefile / Makefile的目录中没有文件asd.c
  • 您没有 cc ,或者无法通过PATH找到它。只需在外壳中手动输入 cc 即可检查
  • 您从另一个目录开始制作,例如make -f elsewhere/makefile,在这种情况下找不到 asd.c

请注意,如果只有asd.exe: asd.o行,它将建立名为asd.o的可执行文件

您可以这样更改 makefile

CC = gcc

asd.exe: asd.c
<tab>$(CC) -o asd.exe asd.c

答案 1 :(得分:1)

您简单的makefile就足够了,最可能的是make(1)无法执行默认规则来编译.c文件,默认编译器名为cc并无法更改改为使用gcc,则应将Makefile更改为此:

CC=gcc
asd.exe: asd.o

应该起作用。您还可以创建从ccgcc的链接(这没有什么害处,通常ccgcc的别名,在具有gcc的网站上安装为唯一的编译器)

实际上,您只需说出即可asd

make asd.exe

根本没有makefile,因为有一个隐式规则可以直接从其.c源文件生成可执行文件。但是如果没有cc,还需要指定编译器,因此命令应为:

make CC=gcc asd.exe

或者,如果要始终使用gcc 作为自己喜欢的编译器,只需创建一个环境变量CC并在登录环境中为其分配gcc (我假设您使用的是Windows --- .exe扩展名---并且您知道如何在其中包含新的环境变量)