У меня проблема, что я просто не могу обернуть голову. У меня есть минимальный пример makefile, который должен скомпилировать очень простой файл .c в исполняемую программу.
Когда я запускаю make , компилятор начинает компиляцию, а затем создает сообщение об ошибке
“T: \ printOffsets.c: 10: 21: error: bootIfc.h: нет такого файла или каталога”
Затем я копирую ту же самую командную строку make, которая используется для создания цели и запуска ее непосредственно в том же экземпляре командной оболочки Windows, и внезапная компиляция завершается без ошибок! Командная строка (упрощены названия путей):
T: \ perl \ c \ bin \ gcc.exe T: \ printOffsets.c -IT: \ include \ -o D: \ printOffsets.exe
Откуда мне знать? Ну, сделайте печать командной строки, прежде чем она ее выполнит, поэтому я просто копирую и вставляю ее из оболочки.
Я не понимаю! Как это возможно?? Как может одна и та же команда работать над оболочкой и сбой при запуске из Makefile?
Кстати, я использую GNU Make 3,82 на Windows 7.
Когда команда в make-файле дает другой результат из оболочки, просто убедитесь, что она использует требуемую оболочку.
Добавьте фиктивную цель в ваш файл make:
.PHONY:testshell testshell: echo $(SHELL)
И запустите:
gmake testshell
Если результат не является вашей любимой оболочкой, вы можете заставить ее добавить строку, такую как в начале вашего файла makefile:
SHELL=C:\Windows\System32\cmd.exe
Если вы не уверены в полном пути своей оболочки, просто откройте консоль DOS и запустите:
where cmd
Изменить: альтернативное решение
При использовании sh
shell вместо оболочки cmd
вы также можете заменить все обратные косые черты в командах косой чертой и продолжать использовать sh
.
Изменить 2: изменить оболочку для одной цели