Проблема, с которой вы сталкиваетесь, всегда работает от конечной цели BACKWARDS к источникам, а затем начинает строить и разрешать предварительные условия назад. Make начинается с библиотеки, затем видит, что это за предпосылки, затем видит, какие предпосылки для них, затем предпосылки THOSE и т. Д.
Итак, когда make расширяет значение $(OBJFILES)
, даже если вы задерживаете его с помощью второе расширение, все равно, что .cpp-файлы еще не созданы.
Вы должны объяснить, что существует правило, которое может сгенерировать файл .cpp. Как только make поймет, что это вызовет ваше правило для вас. Вы не сможете использовать подстановочный знак для определения файлов .cpp, которые должны быть созданы, если вы не хотите делать что-то вроде первой сборки всех .cpp-файлов, а затем рекурсивно вызывать make.
Edit:
Вы спросили, почему второе расширение не работает. Я упомянул об этом в своем первом абзаце, но, вероятно, не был достаточно ясен. Make проходит через две стадии обработки. Сначала он читает make-файлы, во-вторых, он проходит через правила и строит вещи. Шаг вторичного расширения задерживает разрешение до второго шага ... но это не поможет вам в этом случае.
Вы просите make построить libEXP.so. Для этого ему необходимо расширить предварительные условия libEXP.so, чтобы он знал, от чего зависит цель. ЭТО - это когда выполняется второе расширение, но здесь мы еще не создали никаких файлов .cpp, потому что мы не знаем, что они нам нужны, поэтому подстановочный знак расширяется до нуля. Make не будет создавать эти .cpp-файлы, пока он не узнает, что он им нужен, и он не может знать, что он им нужен, пока он уже не имеет их, чтобы он мог генерировать список.o файлы для предпосылок libEXP.so. Очевидно, что это не сработает :)
Привет MadScientist, спасибо за объяснение, но вот почему я использовал scendexpansion, в чем смысл, если он не переоценивает значение и не придерживается его первоначального значения. Интересно, если я заменил подстановочную строку в определении CPPFILES, командой оболочки «find $ MY_DIR -name» * .cpp «-type f», вернет мне список правильно, но у меня все еще есть проблема с командой patsubst. Если secondexapnsion работает только с функциями оболочки, мне интересно, как сделать документацию по secondexpansion, говорит, что она может использоваться с patsubst. – learningtocode
Я предполагаю, что я действительно спрашиваю, есть ли способ, которым я могу использовать функцию wildacrd, не жалуясь, что командный шаблон не найден. Кроме того, может ли рекурсивный решить эту проблему, я думал, что переменные в списке предварительных условий считываются из всех включенных make-файлов на этапе чтения? – learningtocode
На самом деле Мэдсиенист был прав. Я поместил правило, чтобы развить файлы cpp в одном файле makefile и переместил строку, чтобы разделить файл .o и библиотеку на другой make-файл. Я вызвал второй make-файл рекурсивно из первого, и вуаля это сработало! Я почти отказался от этого. Но я до сих пор не понимаю, как должен работать этот пример в gnu make документации. В любом случае. Большое вам спасибо MadScientist и Eldar! – learningtocode