Определение переменной пути для файла make - PullRequest
0 голосов
/ 01 февраля 2019

В моих инструкциях по назначению мне было приказано создать

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.c', необходимую для 'getWord.o'.Стоп.

Файлы в папках включают в себя / lib.

Я понимаю только основы make-файлов, поэтому кто-то может мне помочь, как добиться того, что мне было назначеноделать?Что вызывает эту ошибку?

(обновленный код make-файла)

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Так что, очевидно, мне просто нужно определить переменную 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}
0 голосов
/ 01 февраля 2019

getWord.o : getWord.c getWord.h ищет эти файлы в текущем каталоге.

По-видимому, следует использовать GET_WORD для определения пары дополнительных переменных, а не переопределять их как-то иначе, чем то, чтодано явно в присваивании.

Если вы выясните, как установить INC в каталог include/, ваше правило для этих файлов должно выглядеть примерно так:

getWord.o : $(INC)/getWord.c $(INC)/getWord.h
    cc -c $^

Обратите внимание, какзависимость от файла в другом каталоге должна включать имя каталога;и как make на самом деле не будет смотреть на , как создать что-то новое, пока разрешение зависимостей не заставит его (и даже тогда он не знает, что строка в команде, которую он выполняет, равнаодна из зависимостей только потому, что строки идентичны, не говоря уже о том, когда они различны (как в вашей попытке).

Обратите внимание также на использование $^, чтобы сказать «вещи в зависимостях».Как правило, вы хотите избежать повторения информации - если вы что-то меняете, вы не хотите менять ее во многих местах, потому что ее легко забыть (см. Также DRY принцип.)

...Я не думаю, что профессор хочет файл .c во включаемом каталоге, хотя на самом деле;мой файл .h был бы моим предположением.

Кроме того, чтобы просто make без аргументов создать конкретную цель, поместите ее в качестве первой цели в вашем Makefile.

Надеюсь, этого достаточно, чтобы помочь вам понять, как решить вашу задачу!

...