ant*_*guy 8 gnu makefile compilation compiler-warnings
我正在通过"以艰难的方式学习C"来学习C编程.我目前(很长一段时间)参加练习2,可以在这里找到:http://c.learncodethehardway.org/book/ex2.html
在额外信用部分,有一个挑战要求我们编辑Makefile,这样我们就可以使用命令"make"编译.c文件(ex1.c).这正是挑战所说的:
创建一个all:ex1目标,它将仅使用命令make构建ex1.
通过查看这里和其他一些地方,这是我认为正确的代码:
CFLAGS="-Wall" -g
all: ex1
CFLAGS="-Wall" -g
clean:
rm -f ex1
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试运行它时,我得到编译的文件并继续收到错误:
cc "-Wall" -g ex1.c -o ex1
CFLAGS="-Wall" -g
/bin/sh: 1: -g: not found
make: *** [all] Error 127
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?错误消息背后的原因是什么?我怎样才能解决这个问题?
多谢你们.
Tux*_*ude 10
如果all是makefile中的第一个目标(我在这里做了一个疯狂的猜测,因为你没有显示整个Makefile),make会选择那个作为第一个构建目标,当你没有从命令传递一个显式目标时线(即仅仅make)
ex1是一个先决条件all,因此它首先构建它,因此您看到以下行:
cc "-Wall" -g ex1.c -o ex1
Run Code Online (Sandbox Code Playgroud)ex1构建完成后,尝试执行所有的配方,执行以下命令:
CFLAGS="-Wall" -g
Run Code Online (Sandbox Code Playgroud)由于-g它本身不是可以在shell中执行的有效命令或应用程序,因此会出现以下错误:
/bin/sh: 1: -g: not found
Run Code Online (Sandbox Code Playgroud)解:
您已经CFLAGS在makefile的开头定义了,因此无需在配方中再次定义它.即使您希望覆盖变量CFLAGS,也不应将其直接用作配方的一部分.
定义all和clean作为PHONY目标,如果您还没有这样做.目标all并且clean不创建命名文件all或clean执行配方后,因此将这些目标分类为一个好习惯PHONY.
你不需要双引号 -Wall
以下Makefile具有所有这些更正:
CFLAGS = -Wall -g
all: ex1
clean:
rm -f ex1
.PHONY: all clean
Run Code Online (Sandbox Code Playgroud)