8



我正在通过“Learn C the Hard Way”学习 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

但是,当我尝试运行它时,我得到编译的文件并不断收到错误:

cc "-Wall" -g    ex1.c   -o ex1
CFLAGS="-Wall" -g
/bin/sh: 1: -g: not found
make: *** [all] Error 127

这里发生了什么?错误消息背后的原因是什么?我怎样才能解决这个问题?

多谢你们。

4

3 回答 3

10
  • 如果all是你的 makefile 中的第一个目标(我在这里做一个疯狂的猜测,因为你没有显示整个 Makefile),当你没有从命令中传递一个明确的目标时,make 会选择它作为第一个构建目标线(即仅仅make

  • ex1是 的先决条件all,因此它首先构建它,因此您会看到以下行:

    cc "-Wall" -g    ex1.c   -o ex1
    
  • 构建完成后ex1,make 尝试为所有人执行配方,并在其中执行以下命令:

    CFLAGS="-Wall" -g
    
  • 由于-g其本身不是可以在 shell 中执行的有效命令或应用程序,因此您会收到以下错误:

    /bin/sh: 1: -g: not found
    

解决方案:

  • 您已经CFLAGS在 makefile 的开头定义了,因此无需在配方中再次定义它。即使您希望覆盖变量CFLAGS,也不应将其直接用作配方的一部分。

  • 定义allclean作为PHONY目标,如果您还没有这样做的话。目标allclean不会在执行配方后创建名为all或的文件,因此最好将这些目标分类为.cleanPHONY

  • 你不需要双引号-Wall

以下 Makefile 包含所有这些更正:

CFLAGS = -Wall -g

all: ex1

clean:
    rm -f ex1

.PHONY: all clean
于 2013-03-24T20:35:15.137 回答
4
CFLAGS = -Wall -g

all: ex1

clean:
    rm -f ex1

应该是你所需要的,因为 make 有一个内置的默认规则来将 .c 文件编译为可执行文件。

您的错误是将变量赋值用作命令。有的部分

 CFLAGS="-Wall" -g

尝试-g使用一次性变量 assignment运行命令CFLAGS="-Wall"

于 2013-03-24T20:35:07.137 回答
0

我想建议一个调整,以便您ex1只需输入即可构建make,无论这是第一次编译还是重新编译源代码。

资源: ex1.c

生成文件:

CFLAGS=-Wall -g

all : clean ex1

clean:
    rm -rf ex1 ex1.dSYM

.PHONY: all clean

通过将cleanPhony Target 添加为 的第一个先决条件all它将在执行带有先决条件rm -rf ex1 ex1.dSYM的隐含命令之前执行该命令。ccex1

此外,在 Mac OS-X 上,使用执行中的命令.PHONY all clean不是必需的,但是,设置这样可能是一个很好的先例,以便以后阅读代码的任何人都意识到 all 和 clean 不是实际的目标文件。makeMakefile

哦,非常感谢 Zed A. Shaw 让 Learn the Hard Way 在他的网站Learn C the Hard Way 上免费阅读。

于 2015-07-22T05:10:06.253 回答