Проблема, с которой вы столкнулись, заключается в том, что make всегда работает от конечной цели НАЗАД до источников, а затем снова начинает строить и разрешать предпосылки обратно.Make запускается с библиотекой, затем видит, каковы ее предварительные условия, затем видит, каковы предварительные условия для них, затем необходимые условия для ТЕ и т. Д. И т. Д.
Итак, когда make расширяет значение $(OBJFILES)
, даже еслиВы задерживаете это при втором расширении, но все равно случается, что файлы .cpp еще не созданы.
Вы должны объяснить, что существует правило, которое может генерировать файл .cpp.Как только make поймет это, он применит ваше правило для вас.Однако вы не сможете использовать подстановочный знак для определения файлов .cpp, которые нужно собрать, если только вы не захотите сделать что-то вроде первой сборки всех файлов .cpp, а затем рекурсивно вызвать make.
Редактировать:
Вы спросили, почему не работает второе расширение.Я упоминал об этом в моем первом абзаце, но, вероятно, не был достаточно ясен.Марка проходит две стадии обработки.Сначала он читает make-файлы, затем он проходит через правила и создает вещи.Вторичный шаг расширения задерживает разрешение до этого второго шага ... но это не поможет вам в этом случае.
Вы просите make собрать libEXP.so.Для этого ему необходимо расширить предварительные условия для libEXP.so, чтобы он знал, от чего зависит цель. ЭТО - это когда выполняется второе расширение, но здесь мы еще не создали никаких файлов .cpp, потому что мы не знаем, что они нам нужны, поэтому подстановочный знак расширяется до нуля.Make не будет создавать эти файлы .cpp, пока не узнает, что они им нужны, и не сможет знать, что они им нужны, пока у них их уже нет, поэтому он может сгенерировать список файлов .o для предварительных требований libEXP.so.Это явно не сработает:)