«нет входных файлов» при сборке с gcc Android NDK r6b - PullRequest
0 голосов
/ 12 января 2012

После возвращения из нью-йоркских каникул я столкнулся со странной проблемой при создании проектов, с которыми у меня раньше не было подобных проблем.
Каждый проект представляет собой общую / статическую библиотеку или приложение для Android, созданное с использованием NDK 6b с использованиемgcc кросс-компилятор (cygwin).
Операционная система - Windows 7 (32-разрядная), и я не установил / не удалил / не переустановил соответствующее программное обеспечение (в праздничные дни:).

У меня естьпопытался собрать стандартный образец NDK hello-jni - возникает та же ошибка.
Журнал:

A.User@A-User-L ~/Devel/hello-jni
$ ndk-build
Gdbserver      : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver
Gdbsetup       : libs/armeabi/gdb.setup
Compile thumb  : hello-jni <= hello-jni.c
arm-linux-androideabi-gcc.exe: /cygdrive/e/Users/A.User.ORG/Devel/hello-jni/jni/hello-jni.c: No such file or directory
arm-linux-androideabi-gcc.exe: no input files
/cygdrive/c/dev/Android/android-ndk-r6b/build/core/build-binary.mk:217: recipe for target `/cygdrive/e/Users/A.User.ORG/Devel/hello-jni/obj/local/armeabi/objs-debug/hello-jni/hello-jni.o' failed
make: *** [/cygdrive/e/Users/A.User.ORG/Devel/hello-jni/obj/local/armeabi/objs-debug/hello-jni/hello-jni.o] Error 1

Подробный журнал (извините за перегруженность буквами):

A.User@A-User-L ~/Devel/hello-jni
$ ndk-build V=1
rm -f /cygdrive/e/Users/A.User.ORG/Devel/hello-jni/libs/armeabi/lib*.so /cygdrive/e/Users/A.User.ORG/Devel/hello-jni/libs/armeabi-v7a/lib*.so /cygdrive/e/Users/A.User.ORG/Devel/hello-jni/libs/x86/lib*.so
rm -f /cygdrive/e/Users/A.User.ORG/Devel/hello-jni/libs/armeabi/gdbserver /cygdrive/e/Users/A.User.ORG/Devel/hello-jni/libs/armeabi-v7a/gdbserver /cygdrive/e/Users/A.User.ORG/Devel/hello-jni/libs/x86/gdbserver
rm -f /cygdrive/e/Users/A.User.ORG/Devel/hello-jni/libs/armeabi/gdb.setup /cygdrive/e/Users/A.User.ORG/Devel/hello-jni/libs/armeabi-v7a/gdb.setup /cygdrive/e/Users/A.User.ORG/Devel/hello-jni/libs/x86/gdb.setup
Gdbserver      : [arm-linux-androideabi-4.4.3] libs/armeabi/gdbserver
mkdir -p /cygdrive/e/Users/A.User.ORG/Devel/hello-jni/libs/armeabi
install -p /cygdrive/c/dev/Android/android-ndk-r6b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/gdbserver /cygdrive/e/Users/A.User.ORG/Devel/hello-jni/libs/armeabi/gdbserver
Gdbsetup       : libs/armeabi/gdb.setup
mkdir -p /cygdrive/e/Users/A.User.ORG/Devel/hello-jni/libs/armeabi
echo "set solib-search-path /cygdrive/e/Users/A.User.ORG/Devel/hello-jni/obj/local/armeabi" > /cygdrive/e/Users/A.User.ORG/Devel/hello-jni/libs/armeabi/gdb.setup
echo "directory /cygdrive/c/dev/Android/android-ndk-r6b/platforms/android-8/arch-arm/usr/include /cygdrive/e/Users/A.User.ORG/Devel/hello-jni/jni /cygdrive/c/dev/Android/android-ndk-r6b/sources/cxx-stl/system" >> /cygdrive/e/Users/A.User.ORG/Devel/hello-jni/libs/armeabi/gdb.setup
Compile thumb  : hello-jni <= hello-jni.c
/cygdrive/c/dev/Android/android-ndk-r6b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/arm-linux-androideabi-gcc -MMD -MP -MF /cygdrive/e/Users/A.User.ORG/Devel/hello-jni/obj/local/armeabi/objs-debug/hello-jni/hello-jni.o.d.org -fpic  -ffunction-sections  -funwind-tables  -fstack-protector  -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__  -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__   -Wno-psabi -march=armv5te  -mtune=xscale  -msoft-float  -mthumb  -Os  -fomit-frame-pointer  -fno-strict-aliasing  -finline-limit=64  -I/cygdrive/e/Users/A.User.ORG/Devel/hello-jni/jni  -DANDROID  -Wa,--noexecstack  -O0 -g  -I/cygdrive/c/dev/Android/android-ndk-r6b/platforms/android-8/arch-arm/usr/include  -c   /cygdrive/e/Users/A.User.ORG/Devel/hello-jni/jni/hello-jni.c -o /cygdrive/e/Users/A.User.ORG/Devel/hello-jni/obj/local/armeabi/objs-debug/hello-jni/hello-jni.o &&  ( if [ -f "/cygdrive/e/Users/A.User.ORG/Devel/hello-jni/obj/local/armeabi/objs-debug/hello-jni/hello-jni.o.d.org" ]; then  awk -f /cygdrive/c/dev/Android/android-ndk-r6b/build/awk/convert-deps-to-cygwin.awk /cygdrive/e/Users/A.User.ORG/Devel/hello-jni/obj/local/armeabi/objs-debug/hello-jni/hello-jni.o.d.org > /cygdrive/e/Users/A.User.ORG/Devel/hello-jni/obj/local/armeabi/objs-debug/hello-jni/hello-jni.o.d &&  rm -f /cygdrive/e/Users/A.User.ORG/Devel/hello-jni/obj/local/armeabi/objs-debug/hello-jni/hello-jni.o.d.org;  fi )
/cygdrive/c/dev/Android/android-ndk-r6b/build/core/build-binary.mk:217: recipe for target `/cygdrive/e/Users/A.User.ORG/Devel/hello-jni/obj/local/armeabi/objs-debug/hello-jni/hello-jni.o' failed
arm-linux-androideabi-gcc.exe: /cygdrive/e/Users/A.User.ORG/Devel/hello-jni/jni/hello-jni.c: No such file or directory
arm-linux-androideabi-gcc.exe: no input files
make: *** [/cygdrive/e/Users/A.User.ORG/Devel/hello-jni/obj/local/armeabi/objs-debug/hello-jni/hello-jni.o] Error 1

Содержимое Android.mk довольно стандартно:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := hello-jni.c

include $(BUILD_SHARED_LIBRARY)

Я знаю, что cygwin в Windows не поддерживает символические ссылки - в дереве каталогов нет символических ссылок.
Нетзапущен жестокий антивирус, только Защитник Windows.
Я запускаю сборку как обычный пользователь, как делал это в прошлом году (то есть без изменений учетных данных).

Что может быть не так ?

Связанные вопросы:

[Обновление] Process Monitor показывает, что кросс-компилятор пытается получить доступ к «неправильному пути»: E:\cygdrive\e\Users\A.Kravtsov.SURC\Devel\hello-jni\jni\hello-jni.c ...
Интересно, как этот инструмент работал раньше!
Более подробная информация должна появиться, как только я копаюэто до :)[Обновление № 2] На другом ПК (32-битная Windows XP), на котором установлен почти такой же набор инструментов (та же версия Cygwin, Android NDK), журнал выглядит иначе:

Compile thumb  : hello-jni <= hello-jni.c
/cygdrive/c/dev/android-ndk-r6b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/arm-linux-androideabi-gcc -MMD -MP -MF E:/Users/A.User.SURC/Devel/hello-jni/obj/local/armeabi/objs-debug/hello-jni/hello-jni.o.d.org -fpic -ffunction-sections -funwind-tables -fstack-protector -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__  -Wno-psabi -march=armv5te -mtune=xscale -msoft-float -mthumb -Os -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -IE:/Users/A.User.SURC/Devel/hello-jni/jni -DANDROID  -Wa,--noexecstack -O0 -g -IC:/dev/android-ndk-r6b/platforms/android-8/arch-arm/usr/include -c  E:/Users/A.User.SURC/Devel/hello-jni/jni/hello-jni.c -o E:/Users/A.User.SURC/Devel/hello-jni/obj/local/armeabi/objs-debug/hello-jni/hello-jni.o && ( if [ -f "E:/Users/A.User.SURC/Devel/hello-jni/obj/local/armeabi/objs-debug/hello-jni/hello-jni.o.d.org" ]; then awk -f /cygdrive/c/dev/android-ndk-r6b/build/awk/convert-deps-to-cygwin.awk E:/Users/A.User.SURC/Devel/hello-jni/obj/local/armeabi/objs-debug/hello-jni/hello-jni.o.d.org > E:/Users/A.User.SURC/Devel/hello-jni/obj/local/armeabi/objs-debug/hello-jni/hello-jni.o.d && rm -f E:/Users/A.User.SURC/Devel/hello-jni/obj/local/armeabi/objs-debug/hello-jni/hello-jni.o.d.org; fi )

Для некоторыхНепонятные причины gcc здесь подается путями в стиле Windows ... и вот как процессы должны взаимодействовать.
Итак, вопрос в том, , как дать команду cygwin / NDK для передачи правильных путей ?

Ответы [ 2 ]

0 голосов
/ 12 января 2012

Я наконец-то обнаружил причину проблем на моем компьютере с помощью ndk-build.
Вкратце: это было вызвано конфликтом между mount и mount.exe в Cygwin, который является частью функции «Клиент для NFS» (я действительно недавно установил ее вместе с клиентом Telnet).

Дополнительная информация

Я обнаружил аналогичную проблему, упомянутую в статье " Сборка инфраструктуры Necessitas Qt с использованием NDK-r5b и Cygwin " - у человека возникли проблемы с путями включения NDK, которые он решил, изменив сценарии .
Этот совет помог мне найти соответствующий скрипт gen-windows-host-path.awk в NDK, который выполняет преобразование путей (из стиля cygwin в Windows).
Он опирается на mount, в котором перечислены все диски при вызове без параметров.
И оказалось, что mount на моем ПК не видел никаких дисков ... потому что это было mount.exe на /cygdrive/c/Windows/system32/ от Windows, а не /usr/bin/mount от Cygwin.
По умолчанию mount.exe отсутствует в Windows, и в этом случае вы, вероятно, установили «Клиент для NFS».
Таким образом, решение (на самом деле это обходной путь) заключается в удалении функции «Клиент для NFS» из Windows .

0 голосов
/ 12 января 2012

Файл исходного кода находится в правильном каталоге?Проверьте путь, указанный в сообщении об ошибке.Исходные файлы c / c ++ должны находиться в подкаталоге jni, а не в каталоге src.

Кроме того, не уверен, что это поможет, последние версии SDK / NDK должны поддерживать собственные пакетные файлы Windows.Cygwin больше не требуется (поддержка отладки все еще отсутствует).Попробуйте выполнить сборку из командной строки Windows, используя ndk-build.

Кроме того, работали ли ранее те же настройки (на той же машине с теми же файлами / каталогами)?

...