Что мне не хватает?
Достаточно кавычек, возможно. В Unix вам понадобятся:
HEADER = "../somePath/theHeader.h"
${CC} ${CFLAGS} -DHEADER='${HEADER}' -c file.cpp
Определение макроса включает двойные кавычки. Если вы не завершаете аргумент -DHEADER
в одинарных кавычках, оболочка (un) помогает удалять двойные кавычки. Поместив его в одинарные кавычки, оболочка помогает удалять одинарные кавычки, оставляя двойные кавычки для компилятора.
Правила обработки командной строки различны для Windows, а кавычки обрабатываются по-разному с помощью процессора cmd.exe
.
Кстати, когда я хочу, чтобы сделать это возможным для человека, чтобы определить значение для HEADER
в командной строке, я использую:
HEADER = ../somePath/theHeader.h
${CC} ${CFLAGS} -DHEADER='"${HEADER}"' -c file.cpp
Теперь я могу запустить:
make HEADER=/other/path/to/header.h file.o
и оно работает. С оригинальной записи, я должен был бы написать:
make HEADER='"/other/path/to/header.h"' file.o
или что-то подобное, которое fiddlier, и вдвойне неловко, если вы хотите использовать выходные данные команды, чтобы указать имя файла. Сравните первый вариант со вторым:
make HEADER=$(locate header.h)
make HEADER="\"$(locate header.h)\""
В качестве альтернативы, вы можете использовать препроцессор для вставки цитаты, которые могли бы быть меньше хлопот: '#define STRINGIFY (х) STRINGIFY_ (х)'/'#define STRINGIFY_ (x) # x'/'#include STRINGIFY (HEADER)' – rici
Это правда; Мне не нужно было это использовать, но он должен работать нормально. И, как вы говорите, это оборачивает цитаты в командной строке, что полезно. –
@rici Ваша реклама заслуживает ответа. – Olumide