使用“make”编译任何C程序(来自Makefile)

时间:2013-03-24 20:14:37

标签: compilation makefile gnu compiler-warnings



我正在通过“以艰难的方式学习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

这里发生了什么?错误消息背后的原因是什么?我该如何解决这个问题?

谢谢你们。

3 个答案:

答案 0 :(得分:10)

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

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

    cc "-Wall" -g    ex1.c   -o ex1
    
  • 构建ex1后,尝试执行所有的配方,执行以下命令:

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

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

<强>解决方案:

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

  • allclean定义为PHONY目标,如果您尚未这样做的话。执行配方后,目标allclean不会创建名为allclean的文件,因此将这些目标分类为{{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上免费阅读“学习艰难之路”。