Я пытаюсь создать проект на WSL. тот же проект компилируется в ubuntu18.04 VM, но не в WSL ubuntu18.04. Проблема, которую я вижу, заключается в том, что make не может включить MakefileCommom в make-файл. Содержимое make-файла выглядит следующим образом:
-include ~/MakefileCommon
RM := rm -rf
all:
$(MAKE) -f ./$(MAKEFILE_TARGET) $@
clean:
$(MAKE) -f ./$(MAKEFILE_TARGET) $@
image:
$(MAKE) -f ./$(MAKEFILE_TARGET) $@
uninstall:
$(MAKE) -f ./$(MAKEFILE_TARGET) $@
-include ../makefile.targets
Я использую следующую команду:
make -C builds clean all
Я получаю следующее сообщение об ошибке:
make -f ./ clean
make[1]: *** ./: Is a directory. Stop.
Таким образом, я вижу, что $ (MAKEFILE_TARGET) отмечает, что импортируется. операторы импорта находятся в MakefileCommon
Тильда ~
в имени пути - это магический символ, который расширяется до домашнего каталога пользователя в системе POSIX. Я понятия не имею, до чего он расширяется в Windows, но думаю, это не то, что вы ожидали. Попробуйте указать здесь реальный путь вместо использования ~
. Также вы можете запустить make -d
и изучить вывод, чтобы узнать, какой путь он использует для MakefileCommon
.
Вы пробовали мое предложение запустить make с опцией -d
и просмотреть вывод для MakefileCommon
, чтобы узнать, какой путь он ищет? Такой путь существует? Он устанавливает переменную MAKEFILE_TARGET
? Возможно, вам стоит попробовать удалить -include
и вместо этого просто использовать include
для MakefileCommon
, чтобы он потерпел неудачу, если этот файл не существует.
Я пробовал это, у меня ошибка file does not exist
. если я использую ~
, он ищет файл /home/yash/MakefileCommon
, а это неправильный путь. Следовательно, не уверен, почему он не выполняет поиск в каталоге сборок на /home/yash/Project/builds
, где на самом деле находится файл. Также в окнах, когда я использую ls
, я не вижу .
и ..
в списке. Итак, я предполагаю, что Windows просто игнорирует .
, поэтому он не может найти ./Makefilecommon
, поскольку он заменяется на /MakefileCommon
.
Думаю, вы могли запутаться. Символ тильды всегда обозначает домашний каталог пользователя (это верно и для систем POSIX). Таким образом, ~/MakefileCommon
всегда будет означать файл MakefileCommon
в домашнем каталоге пользователя, а именно это make ищет выше. Если вы хотите найти MakefileCommon
в каком-то другом каталоге, вы не можете использовать ~
. В частности, ~
означает, что нет означает текущий каталог (если текущий каталог не является домашним каталогом пользователя. Для поиска файла в текущем каталоге вы используете только include MakefileCommon
или include ./MakefileCommon
.
Что касается ls
, не отображающего .
или ..
, это нормально: файлы и каталоги, начинающиеся с символа .
, «скрыты», и ls
не отображает их по умолчанию. Это верно и для систем POSIX. Если вы хотите увидеть все файлы, включая скрытые, используйте опцию -a
: ls -a
, тогда вы их увидите.
Спасибо за объяснение. Я не очень хорошо разбираюсь в Linux-системах. Я очень ценю ваши комментарии.
Я сделал, он также показал ту же проблему. Я даже использовал. Вместо ~. Но все та же проблема