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”
- 如果
是makefile中的第一个目标(因为您没有显示整个makefile,所以我在这里做一个粗略的猜测),make会选择它作为第一个要构建的目标,如果您没有从命令行传递一个显式的目标(即仅仅all
)make
是ex1
的先决条件,因此它首先构建它,因此您可以看到以下行:all
cc "-Wall" -g ex1.c -o ex1
- 在构建
后,make尝试为所有人执行配方,其中它执行以下命令:ex1
CFLAGS="-Wall" -g
- 由于
本身不是可在shell中执行的有效命令或应用程序,因此会出现以下错误:-g
/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
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”。我真的很想知道是什么导致了这一点,因此我可以如何修复它