#android #makefile #linux-kernel #kernel-module
#Android #makefile #linux-ядро #kernel-module
Вопрос:
Я пытаюсь скомпилировать определенный модуль ядра Android на моем ПК с Windows 10, используя Android NDK.
Я попытался собрать его, используя следующий Makefile:
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 29
EXTRAVERSION =
obj-m := test.o
PWD := $(shell pwd)
default:
$(MAKE) ARCH=arm64 CROSS_COMPILE=/home/AndroidNDK/android-ndk-r21d/toolchains/aarch64-linux- android-4.9/bin/aarch64-linux-android- -C $(KERNEL_DIR) SUBDIRS=$(PWD) modules
clean:
$(MAKE) -C $(KERNEL_PATH) SUBDIRS=$(PWD) clean
Но продолжайте получать эту ошибку:
make ARCH=arm64 CROSS_COMPILE=/home/AndroidNDK/android-ndk-r21d/toolchains/aarch64-linux-android-4.9/bin/aarch64-linux-android- -C SUBDIRS=/cygdrive/c/Project modules
make[1]: *** SUBDIRS=/cygdrive/c/Project: No such file or directory. Stop.
make: *** [Makefile:11: default] Error 2
- Я взял Makefile с github и немного изменил его.
- Исходный файл модуля называется test.c
Есть идеи, почему я получаю эту ошибку?
Ответ №1:
Совершенно очевидно, почему вы получаете эту ошибку. Посмотрите на команду, которая выполняется make:
make ARCH=arm64 CROSS_COMPILE=... -C SUBDIRS=/cygdrive/c/Project modules
Обратите внимание, что строка SUBDIRS=/cygdrive/c/Project
идет после -C
параметра. Какой -C
вариант? Проверьте GNU make manual, чтобы обнаружить, что в нем указан каталог, который make должен изменить перед запуском.
Итак, вы говорите make «изменить на каталог с именем SUBDIRS=/cygdrive/c/Project
«, и, конечно, этот каталог не существует, поэтому вы получаете эту ошибку.
Итак, почему ваша командная строка такая? Посмотрите на правило, которое вы написали:
default:
$(MAKE) ARCH=arm64 CROSS_COMPILE=... -C $(KERNEL_DIR) SUBDIRS=$(PWD) modules
Итак, после -C
должно быть значение переменной KERNEL_DIR
.
Однако в вашем makefile вы не определили переменную KERNEL_DIR
, поэтому, когда make расширяет ее, она расширяется до пустой строки.
Комментарии:
1. Кроме того, это должно быть M , а не дочерние файлы .