Compilation 使用“just”编译任何C程序;制造;(来自Makefile)

Compilation 使用“just”编译任何C程序;制造;(来自Makefile),compilation,makefile,gnu,compiler-warnings,Compilation,Makefile,Gnu,Compiler Warnings,我正在通过“艰苦学习C”学习C编程。我目前(相当长一段时间)正在练习2,可以在这里找到: 在额外学分部分,有一个挑战要求我们编辑Makefile,这样我们就可以只使用命令“make”编译.c文件(ex1.c)。这就是挑战的确切含义: 创建一个all:ex1目标,该目标将仅使用make命令生成ex1 通过查看和其他一些地方,我认为这是正确的代码: CFLAGS="-Wall" -g all: ex1 CFLAGS="-Wall" -g clean: rm -f ex1 但是,



我正在通过“艰苦学习C”学习C编程。我目前(相当长一段时间)正在练习2,可以在这里找到:

在额外学分部分,有一个挑战要求我们编辑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
这里发生了什么?错误消息背后的原因是什么?我怎样才能解决这个问题

谢谢各位

CFLAGS = -Wall -g

all: ex1

clean:
    rm -f ex1
因为make有一个内置的默认规则,可以将.c文件编译成可执行文件

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

 CFLAGS="-Wall" -g
尝试使用一次性变量赋值运行命令
-g
CFLAGS=“-Wall”

  • 如果
    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=-Wall -g

all : clean ex1

clean:
    rm -rf ex1 ex1.dSYM

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

  • 所有
    清理
    定义为
    虚假
    目标(如果您尚未这样做)。执行配方后,目标
    all
    clean
    不会创建名为
    all
    clean
    的文件,因此最好将这些目标分类为
    PHONY

  • -Wall

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

CFLAGS = -Wall -g

all: ex1

clean:
    rm -f ex1

.PHONY: all clean

我建议进行一次调整,这样您只需输入
make
,就可以构建
ex1
,无论这是源代码的第一次编译还是重新编译

来源:
ex1.c

Makefile:

CFLAGS=-Wall -g

all : clean ex1

clean:
    rm -rf ex1 ex1.dSYM

.PHONY: all clean
通过添加
clean
Phony Target作为
all
的第一个先决条件,它将在使用
ex1
先决条件执行隐含的
cc
命令之前执行
rm-rf ex1 ex1.dSYM
命令

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


哦,非常感谢Zed a.Shaw,他让“艰难学习”在他的网站上免费阅读

嗯,删除双引号似乎没什么作用。程序本身正在编译,但是我收到了这些奇怪的错误消息,关于没有找到“-g”。我真的很想知道是什么导致了这一点,因此我可以如何修复它