Как удалить libgnustl_static.a при компоновке при компиляции apk с нативным кодом с помощью Android Studio? - PullRequest
1 голос
/ 10 июня 2019

Я использую Android Studio (3.4.1) для создания apk, который содержит часть C ++. Фаза компиляции работает, а фаза соединения выдает ошибку.

Ошибка:

clang ++: ошибка : такого файла или каталога нет: «/Users/homefolder/Library/Android/sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/libs/x86/libgnustl_static.a'

Это происходит из последней строки команды full link:

/ Пользователи / homefolder / Library / Android / SDK / NDK-расслоение / компилированные инструменты / LLVM / прекомпилированные / Darwin-x86_64 / bin / лязг ++ --target = i686-none-linux-android23 --gcc-toolchain = / пользователи / домашняя папка / библиотека / Android / sdk / ndk-bundle / цепочки инструментов / llvm / prebuilt / darwin-x86_64 --sysroot = / Users / homefolder / Library / Android / SDK / NDK-расслоение / компилированные инструменты / LLVM / прекомпилированные / Darwin-x86_64 / SYSROOT -fPIC -g -DANDROID -fdata-секции -функция-секции -funwind-таблицы -fstack-protector-strong -no-канонические-префиксы -mstackrealign -fno-addrsig -Wa, - noexecstack -Wformat -Werror = format-security -O2 -DNDEBUG -Wl, - exclude-libs, libgcc.a -Wl, - exclude-libs, libatomic.a -static-libstdc ++ -Wl, - build-id -Wl, - warn-shared-textrel -Wl, - фатальные-предупреждения -Wl, - нет неопределенных -Qunused-arguments -Wl, -z, noexecstack -shared -Wl, -soname, libmy_lib.so -o ../../../. ./build/intermediates/cmake/release/obj/x86/libmy_lib.so CMakeFiles / my_lib.dir / SRC / главная / CPP / my_lib.cpp.o -llog ../../../../libs/x86/libssl.a ../../../../libs/x86/libcrypto.a -latomic -lm "/ Пользователи /homefolder/Library/Android/sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/libs/x86/libgnustl_static.a"

Действительно, эта библиотека не существует в моей папке SDK. Папка gnu-lib-stdc++ не существует.

Насколько я понимаю, нативный код скомпилирован с CMake. CMake генерирует файлы build.ninja и выполняет компиляцию ниндзя. Если я вручную изменю эти сгенерированные файлы build.ninja , чтобы удалить эту библиотеку , а затем вызову ninja в терминале (в правильной папке), то он прекрасно компилируется и связывается.

Проблема:

Где мне изменить настройки Android Studio, чтобы эти файлы build.ninja больше не содержали эту библиотеку? Я не хочу изменять сгенерированные файлы каждый раз, когда я создаю apk.

Что я пробовал до сих пор:

Единственный найденный мной файл параметров, связанный с CMake, это CMakeList.txt. А из документации ( 1 ) кажется, что эту библиотеку можно настроить с помощью CMAKE_ANDROID_STL_TYPE. Я поставил это значение на 'none' или 'system' в CMakeList.txt, но я не вижу разницы в файлах build.ninja.

# CMakeList.txt
set(CMAKE_ANDROID_STL_TYPE none)

Конфигурация:

  • Android Studio 3.4.1
  • Инструменты Android SDK 26.1.1
  • CMake 3.10.2 (не уверен, 3.6 также установлена)
  • macOS 10.14

Ответы [ 2 ]

1 голос
/ 14 июня 2019

А из документации (1) кажется, что эту библиотеку можно настроить с помощью CMAKE_ANDROID_STL_TYPE. Я поместил это в 'none' или 'system' в CMakeList.txt, но не вижу разницы в файлах build.ninja.

# CMakeList.txt
set(CMAKE_ANDROID_STL_TYPE none)

Неправильная документация. Вы хотите https://developer.android.com/ndk/guides/cmake. Установите следующее значение в build.gradle:

android {
  defaultConfig {
    externalNativeBuild {
      cmake {
        arguments "-DANDROID_STL=none",
      }
    }
  }
}
0 голосов
/ 10 июня 2019

После дальнейших исследований благодаря комментариям Цыварева я нашел решение: я вручную изменил все CMakeCache.txt файлы в папке .ExternalNativeBuild.

До:

CMAKE_CXX_STANDARD_LIBRARIES:STRING=-latomic -lm "/Users/homefolder/Library/Android/sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/libgnustl_static.a"

Исправление вручную:

CMAKE_CXX_STANDARD_LIBRARIES:STRING=-latomic -lm

Тогда автоматически созданные файлы build.ninja больше не содержат ссылку на libgnustl_static.a.И apk компилируется.

Это исправление не делает отправку мне.Я думал, что все файлы в .ExternalNativeBuild генерируются автоматически и стираются при каждой новой сборке.Само имя содержит cache, поэтому оно не похоже на файл, который пользователь должен изменить.Тем не менее, это было рабочее решение моей проблемы.

Я считаю, что эти CCMakeCaches.txt файлы создаются при первой сборке, а затем повторно используются для следующих запросов на сборку.Это очень не логично для меня.Я не понимаю, почему set(CMAKE_ANDROID_STL_TYPE none) не сработал.

...