Ошибка: использование необъявленного идентификатора PTHREAD_MUTEX_ROBUST в сборке грузов liblmdb-sys для цели aarch64-linux-android

Я пытаюсь скомпилировать проект rust в целевой Android (aarch64 -линукс-андроид).

Из комментариев в код lmdb, кажется, нужно запустить компиляцию

"aarch64-linux-android-gcc" "-O2" "-ffunction-sections" "-fdata-sections" "-fPIC" "-Wall" "-Wextra" "-o" "/Users/username/grin-wallet/target/aarch64-linux-android/release/build/liblmdb-sys-7a2d430dc3c9f3e3/out/mdb/libraries/liblmdb/mdb.o" "-c" "mdb/libraries/liblmdb/mdb.c"

с дополнительным флагом -DMDB_USE_ROBUST=0. Это можно настроить либо с помощью команды cargo build, либо добавив что-то в Cargo.toml?

Ошибка, которую я получаю:

error: failed to run custom build command for `liblmdb-sys v0.2.2`

Caused by:
  process didn't exit successfully: `/Users/username/grin-wallet/target/release/build/liblmdb-sys-b6bfc7b665736f9b/build-script-build` (exit code: 101)
--- stdout
TARGET = Some("aarch64-linux-android")
TARGET = Some("aarch64-linux-android")
HOST = Some("x86_64-apple-darwin")
TARGET = Some("aarch64-linux-android")
TARGET = Some("aarch64-linux-android")
HOST = Some("x86_64-apple-darwin")
CC_aarch64-linux-android = None
CC_aarch64_linux_android = None
TARGET_CC = None
CC = None
TARGET = Some("aarch64-linux-android")
HOST = Some("x86_64-apple-darwin")
CFLAGS_aarch64-linux-android = None
CFLAGS_aarch64_linux_android = None
TARGET_CFLAGS = None
CFLAGS = None
DEBUG = Some("false")
running: "aarch64-linux-android-gcc" "-O2" "-ffunction-sections" "-fdata-sections" "-fPIC" "-Wall" "-Wextra" "-o" "/Users/username/grin-wallet/target/aarch64-linux-android/release/build/liblmdb-sys-7a2d430dc3c9f3e3/out/mdb/libraries/liblmdb/mdb.o" "-c" "mdb/libraries/liblmdb/mdb.c"
cargo:warning=mdb/libraries/liblmdb/mdb.c:4625:13: warning: implicit declaration of function 'pthread_mutexattr_setrobust' is invalid in C99 [-Wimplicit-function-declaration]
cargo:warning=                        || (rc = pthread_mutexattr_setrobust(&mattr, PTHREAD_MUTEX_ROBUST))
cargo:warning=                                 ^
cargo:warning=mdb/libraries/liblmdb/mdb.c:4625:49: error: use of undeclared identifier 'PTHREAD_MUTEX_ROBUST'
cargo:warning=                        || (rc = pthread_mutexattr_setrobust(&mattr, PTHREAD_MUTEX_ROBUST))
cargo:warning=                                                                     ^
cargo:warning=mdb/libraries/liblmdb/mdb.c:9821:33: warning: unused parameter 'env' [-Wunused-parameter]
cargo:warning=mdb_env_get_maxkeysize(MDB_env *env)
cargo:warning=                                ^
cargo:warning=mdb/libraries/liblmdb/mdb.c:10002:10: warning: implicit declaration of function 'pthread_mutex_consistent' is invalid in C99 [-Wimplicit-function-declaration]
cargo:warning=                        rc2 = mdb_mutex_consistent(mutex);
cargo:warning=                              ^
cargo:warning=mdb/libraries/liblmdb/mdb.c:351:37: note: expanded from macro 'mdb_mutex_consistent'
cargo:warning=#define mdb_mutex_consistent(mutex)     pthread_mutex_consistent(mutex)
cargo:warning=                                        ^
cargo:warning=3 warnings and 1 error generated.
exit code: 1

person Daniel Wang    schedule 25.07.2019    source источник
comment
Похоже, вы используете ящик cc. Было бы хорошо увидеть ваш код, который компилирует библиотеку, например. ваш build.rs.   -  person hellow    schedule 25.07.2019


Ответы (2)


Во-первых, убедитесь, что у вас установлены все цели сборки Android:

rustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android

Затем install cargo-ndk

cargo install cargo-ndk

Теперь вам нужно экспортировать в терминал ряд переменных, которые будут использоваться при сборке.

Если вы используете pkg-config, то

export PKG_CONFIG_ALLOW_CROSS=1

Корневой каталог NDK

export NDK_HOME=the_path_to_the_ndk

Версия платформы

export NDK_API_LEVEL=the_api_level

Обратите внимание, что компиляторы должны быть указаны как clang для более новых версий NDK, поскольку GCC устарел в наборе инструментов Android и больше не присутствует (некоторые проекты пытаются ссылаться на GCC по умолчанию).

export CC=$NDK_HOME/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android$NDK_API_LEVEL-clang
export CXX=$NDK_HOME/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android$NDK_API_LEVEL-clang++

Тогда остальные переменные

export AR=$NDK_HOME/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android-ar
export AS=$NDK_HOME/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android-as
export LD=$NDK_HOME/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android-ld
export RANLIB=$NDK_HOME/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android-ranlib
export STRIP=$NDK_HOME/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android-strip

Вы были на правильном пути, думая -DMDB_USE_ROBUST=0, его просто нужно было передать флагам компилятора

export CFLAGS=-DMDB_USE_ROBUST=0

Затем в вашем проекте rust вам нужно будет создать каталог .config в том же каталоге, что и ваш файл .toml. В каталоге .config вам нужно будет создать файл конфигурации.

В файле конфигурации вам нужно будет указать соответствующие цели сборки для каждой цели, которую вам нужно создать (замените NDK_HOME и NDK_API_LEVEL их соответствующими значениями)

[target.aarch64-linux-android]
ar = "<NDK_HOME>/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android-ar"
linker = "<NDK_HOME>/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android<NDK_API_LEVEL>-clang"

Затем вы сможете успешно построить с помощью

cargo ndk --target aarch64-linux-android --android-platform $NDK_API_LEVEL -- build --release
person Strider    schedule 01.11.2019

Вы не можете просто создать и настроить таргетинг на linex-android, другой способ сделать это — разработать приложение через Android Studio или с помощью Flutter.

person Kipli Antonio Carle Mene    schedule 25.07.2019
comment
Несмотря на то, что просить о вознаграждении довольно грубо: что такое linex-android? Ваш пост необходимо расширить. Много. Так много важной информации отсутствует, например. как включить код ржавчины в Android Studio или Flutter. - person hellow; 25.07.2019
comment
Простите? Что именно ты пытаешься мне сказать? - person hellow; 26.07.2019