在我的作业指导中,我被告知要做一个
没有绝对目录名或派生二进制文件的Makefile。不带参数的make的执行应构建目标程序“ wordpairs”。假设环境变量GET_WORD被定义为目录的路径名,该目录包含目录“ include”和“ lib”,目录中包含getWord.h和libget.a
我的代码目录包含:pic
我的Makefile是:
#DIR := ${GET_WORD}
DIR := ${CURDIR}
Main : getWord.o crc64.o sTools.o hashingTools.o Main.c libget.a
gcc -g -o wordpairs Main.c getWord.o crc64.o sTools.o hashingTools.o $(DIR)/lib/libget.a
getWord.o : getWord.c getWord.h
cc -c $(DIR)/include/getWord.c $(DIR)/include/getWord.h
# cc -c getWord.c getWord.h
crc64.o : crc64.c crc64.h
cc -c crc64.c crc64.h
sTools.o : sTools.c sTools.h
cc -c sTools.c sTools.h
hashingTools.o : hashingTools.c hashingTools.h
cc -c hashingTools.c hashingTools.h
clean :
rm $(DIR)/include/*.h.gch
但是当我运行make时,我得到了
make:***没有规则来创建目标“ getWord.o”,这是“ getWord.o”所需的。停止。
文件位于include / lib文件夹中。
我仅了解make文件的基本知识,因此有人可以帮助我如何实现分配的工作吗?是什么导致此错误?
(更新的Makefile代码)
答案 0 :(得分:0)
getWord.o : getWord.c getWord.h
在当前目录中查找这些文件。
您显然应该使用 GET_WORD
来定义几个其他变量,而不是将其重新定义为赋值中未明确指定的其他变量。
如果您知道如何将INC
设置到include/
目录,则这些文件的规则应类似于
getWord.o : $(INC)/getWord.c $(INC)/getWord.h
cc -c $^
注意对另一个目录中文件的依赖关系必须如何包含目录名;以及make
实际不会如何看待如何来制作新东西,直到依赖关系解析将其强制执行为止(即使那样,它也不知道它运行的命令中的字符串等于一个依赖项,只是因为字符串是相同的,更不用说当它们不同时了(如您的尝试)。
还请注意使用$^
来表示“依赖项中的事物”。通常,您希望避免重复信息-如果您更改了某些内容,则不想在很多地方进行更改,因为它们很容易忘记(另请参见DRY principle.)
...不过,我认为教授实际上并不希望include目录中的.c
文件;只是.h
文件就是我的猜测。
此外,要使没有参数的make
仅创建一个特定目标,请将其作为Makefile
中的第一个目标。
我希望这足以帮助您了解如何解决您的问题!
答案 1 :(得分:0)
因此,显然,我只需要定义GET_WORD变量即可在坡度上将其更改为特定位置。事实是,您显然无法在需求文件行中调用变量(请参阅我没有为getWord.o定义任何具体内容)
GET_WORD = /home/tam#change this!
wordpairs : Main.c crc64.o hashingTools.o sTools.o getWord.o
gcc -o wordpairs $^ -I ${GET_WORD}/include ${GET_WORD}/lib/libget.a
getWord.o :
cc -c ${GET_WORD}/include/getWord.c ${GET_WORD}/include/getWord.h
crc64.o : crc64.c crc64.h
cc -c $^
hashingTools.o : hashingTools.c hashingTools.h
cc -c $^
sTools.o : sTools.c sTools.h
cc -c $^
clean :
rm wordpairs crc64.o hashingTools.o sTools.o *.h.gch
@echo $(GET_WORD) ${GET_WORD}