定义make文件的路径变量

时间:2019-02-01 03:30:22

标签: makefile compilation

在我的作业指导中,我被告知要做一个

  

没有绝对目录名或派生二进制文件的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代码)

2 个答案:

答案 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}