首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误:为aarch64-linux-android目标使用未声明的标识符“PTHREAD_MUTEX_ROBUST”cargo构建liblmdb-sys

错误:为aarch64-linux-android目标使用未声明的标识符“PTHREAD_MUTEX_ROBUST”cargo构建liblmdb-sys
EN

Stack Overflow用户
提问于 2019-07-25 03:32:27
回答 2查看 1K关注 0票数 0

我正在尝试将一个锈蚀工程编译成一个Android目标(aarch64-linux-android)。

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添加某些内容,这是可配置的吗?

我得到的错误是:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2019-11-01 14:07:49

首先,确保安装了所有android构建目标:

代码语言:javascript
复制
rustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android

然后是install cargo-ndk

代码语言:javascript
复制
cargo install cargo-ndk

现在,您需要在终端中导出许多变量,这些变量将被构建使用。

如果您正在使用pkg-config,那么

代码语言:javascript
复制
export PKG_CONFIG_ALLOW_CROSS=1

NDK的根目录

代码语言:javascript
复制
export NDK_HOME=the_path_to_the_ndk

平台版本

代码语言:javascript
复制
export NDK_API_LEVEL=the_api_level

请注意,对于NDK的较新版本,编译器必须指定为clang,因为GCC在android工具链中被废弃,并且不再存在(一些项目在默认情况下试图引用GCC )。

代码语言:javascript
复制
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++

然后剩下的变量

代码语言:javascript
复制
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是正确的,它只需要传递到编译器标志。

代码语言:javascript
复制
export CFLAGS=-DMDB_USE_ROBUST=0

然后,在您的生锈项目中,您需要在与您的.config文件相同的目录中创建一个.toml目录。在.config目录中,您需要创建一个配置文件。

在配置文件中,您需要为需要构建的每个目标指定相关的构建目标(将NDK_HOME和NDK_API_LEVEL替换为各自的值)。

代码语言:javascript
复制
[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"

然后,您应该能够成功地构建

代码语言:javascript
复制
cargo ndk --target aarch64-linux-android --android-platform $NDK_API_LEVEL -- build --release
票数 0
EN

Stack Overflow用户

发布于 2019-07-25 07:24:14

你不能仅仅构建并瞄准linex- Android,另一种方法是通过Android或通过Flutter开发应用程序。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57193895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档