Ошибка Makefile "несколько целевых шаблонов"

82

Мой make-файл не работает с ошибкой:

Makefile:34: *** multiple target patterns.  Stop.

Что это на самом деле означает, как я могу это исправить?

( Руководство GNU make , написанное Captain Obvious, не помогает).


Нашел. У меня было правило по форме:

$(FOO): bar

где FOOбыло установлено из команды оболочки, которая засорила его сообщением об ошибке, содержащим двоеточие.

Корнель
источник
2
Стремительный Google показывает groups.google.com/group/gnu.utils.help/browse_frm/thread/...
Эти ответы - просто перефразирование фразы «у вас есть несколько целевых шаблонов». Думаю, нет. Как я могу это проверить? Что может вызвать это? Какие меры предосторожности необходимы для предотвращения этой проблемы?
Kornel
2
Все заработало одну минуту, а затем мой сценарий выдавил (пол) двоеточие ... хехе. Пытался найти проблему в течение как минимум 3 часов, прежде чем я нашел ваш ответ и ответ @mcr. Вы только что избавили меня от пота !!
GuruM
Истинная первопричина этой проблемы заключается в том, что GNU Make представляет собой ужасный кусок помета, который должен был умереть несколько десятилетий назад.
antred 09

Ответы:

62

У меня это было в Makefile

MAPS+=reverse/db.901:550:2001.ip6.arpa 
lastserial:  ${MAPS}
    ./updateser ${MAPS}

Это из-за :имени файла. Я решил это с помощью

                      -------- уведомление
                     / /
                    vv
MAPS + = обратный / db.901 \: 550 \: 2001.ip6.arpa
последняя серия: $ {MAPS}
    ./updateser $ {MAPS}
mcr
источник
1
У меня такая же проблема, но я не понимаю вашего ответа, не могли бы вы объяснить мне это подробнее,
Пир Фахим Шах
4
@PirFahimShah Ответ гласит, что двоеточие в имени файла (db.901: 550: 2001.ip6.arpa) необходимо экранировать. mcr экранирует двоеточия, помещая перед ними обратную косую черту. Таким образом, make не интерпретирует двоеточия как специальный символ.
Loduwijk
1
Спасибо, у меня сработало. У меня был старый путь к окнам с двоеточием в нем ( C:/Qt/5.8/mingw53_32/bin/rcc.exe) в одном из правил Makefile. Удалите эти
Вадим Котов,
windows make переключился на wsl (ubuntu) и получил эту ошибку, make cleanа затем makeрешил ее. Ошибочная строка была_build/nrf52840_xxaa/app_mpu.c.o: ../../../app_mpu.c \
Tyeth
22

Помимо необходимости избегать двоеточий, как в исходном ответе, я обнаружил, что если отступ отключен, вы потенциально можете получить ту же проблему. В одном make-файле мне пришлось заменить пробелы табуляцией, что позволило мне обойти ошибку.

демонголем
источник
GNU make также может в этом случае сообщить «Нет правила для цели».
davenpcj
4

Я просто хочу добавить, что если вы получаете эту ошибку из-за того, что используете Cygwin make и автоматически сгенерированные файлы, вы можете исправить ее с помощью следующего sed:

sed -e 's@\\\([^ ]\)@/\1@g' -e 's@[cC]:@/cygdrive/c@' -i filename.d

Вам может потребоваться добавить больше символов, чем просто пробел в escape-список при первой замене, но вы поняли идею. Идея заключается в том, что / cygdrive / c - это псевдоним для c:, который программа make cygwin распознает.

И может также добавить

-e 's@^ \+@\t@'

на тот случай, если вы случайно начали с пробелов (хотя я / думаю / обычно это ошибка «отсутствует разделитель»).

Шон МакКлейн
источник
3

Я столкнулся с такой же ошибкой. После попыток я обнаружил, что это произошло из-за «пробела» в имени папки.

Например :

Раньше имя моей папки было: "Qt Projects"

Позже я изменил его на "QtProjects"

и моя проблема была решена.

Это очень просто, но иногда это серьезная проблема.

skg
источник
0

Я имел эту проблему (двоеточие в имени цели) , потому что я был -nв моем GREP_OPTIONSпеременном окружении. Видимо, это привело configureк Makefileнекорректной генерации файла.

Trebor Rude
источник
0

Моя IDE оставила смесь пробелов и вкладок в моем Makefile.

Настройка моего Makefile на использование только вкладок устранила эту ошибку для меня.

Пол Венцель
источник
0

Я также получил эту ошибку (в STM32CubeIDE на основе Eclipse в Windows).

После двойного щелчка по ошибке «несколько целевых шаблонов» он показал путь к .ldфайлу. Оказывается, это еще одна проблема "нелегального характера". Оскорбительным персонажем был (подождите): =

Эвристика недели: используйте только [a..z] в своих путях, так как обязательно будут другие недопустимые символы </vomit>.

Руководство GNU make явно не документирует это.

user103185
источник