我正在通过“以艰难的方式学习C”来学习C编程。我目前(很长一段时间)参加练习2,可以在这里找到:http://c.learncodethehardway.org/book/ex2.html
在额外信用部分,有一个挑战要求我们编辑Makefile,这样我们就可以使用命令“make”编译.c文件(ex1.c)。这正是挑战所说的:
创建一个all:ex1目标,它将仅使用make命令构建ex1。
通过查看here和其他一些地方,这是我认为正确的代码:
CFLAGS="-Wall" -g
all: ex1
CFLAGS="-Wall" -g
clean:
rm -f ex1
然而,当我尝试运行它时,我得到了编译后的文件并且一直出错:
cc "-Wall" -g ex1.c -o ex1
CFLAGS="-Wall" -g
/bin/sh: 1: -g: not found
make: *** [all] Error 127
这里发生了什么?错误消息背后的原因是什么?我该如何解决这个问题?
谢谢你们。
答案 0 :(得分:10)
如果all
是你的makefile中的第一个目标(我在这里做了一个疯狂的猜测,因为你没有显示整个Makefile),make会选择那个作为第一个构建的目标,当你没有从命令行传递一个明确的目标时(即仅make
)
ex1
是all
的先决条件,因此首先构建它,因此您会看到以下行:
cc "-Wall" -g ex1.c -o ex1
构建ex1
后,尝试执行所有的配方,执行以下命令:
CFLAGS="-Wall" -g
由于-g
本身不是可在shell中执行的有效命令或应用程序,因此会出现此错误:
/bin/sh: 1: -g: not found
<强>解决方案:强>
您已经在makefile的开头定义了CFLAGS
,因此无需在配方中再次定义它。即使您希望覆盖变量CFLAGS
,也不应将其直接用作配方的一部分。
将all
和clean
定义为PHONY
目标,如果您尚未这样做的话。执行配方后,目标all
和clean
不会创建名为all
或clean
的文件,因此将这些目标分类为{{1 }}
PHONY
以下Makefile具有所有这些更正:
-Wall
答案 1 :(得分:4)
CFLAGS = -Wall -g
all: ex1
clean:
rm -f ex1
应该只需要,因为make有一个内置的默认规则来将.c文件编译为可执行文件。
您的错误是将变量赋值用作命令。
部分 CFLAGS="-Wall" -g
尝试使用一次性变量赋值-g
运行命令CFLAGS="-Wall"
。
答案 2 :(得分:0)
我想建议一个调整,以便只需输入ex1
即可构建make
,无论这是第一次编译还是源代码的重新编译。
来源: ex1.c
<强>生成文件:强>
CFLAGS=-Wall -g
all : clean ex1
clean:
rm -rf ex1 ex1.dSYM
.PHONY: all clean
通过将clean
Phony Target添加为all
的第一个先决条件,它将在执行隐含rm -rf ex1 ex1.dSYM
之前执行cc
命令带有ex1
先决条件的命令。
另外,在Mac OS-X上使用.PHONY all clean
并不需要make
来执行Makefile
中的命令,但是,设置这样可能是任何人阅读的好先例稍后代码意识到all和clean不是实际的目标文件。
哦,非常感谢Zed A. Shaw在他的网站Learn C the Hard Way上免费阅读“学习艰难之路”。