错误:使用未声明的标识符';PTHREAD_MUTEX_ROBUST';为aarch64 linux android目标构建liblmdb sys

错误:使用未声明的标识符';PTHREAD_MUTEX_ROBUST';为aarch64 linux android目标构建liblmdb sys,android,c,rust,rust-cargo,lmdb,Android,C,Rust,Rust Cargo,Lmdb,我正在尝试将一个应用程序编译成一个Android目标(aarch64 linux Android) 从中的注释来看,似乎需要运行编译 “AARC64 linux android gcc”“-O2”“-ffunction sections”“-fdata sections”“-fPIC”“-Wall”“-Wextra”“-o”“/Users/username/grin wallet/target/AARC64 linux android/release/build/liblmdb-sys-7a2d

我正在尝试将一个应用程序编译成一个Android目标(aarch64 linux Android)

从中的注释来看,似乎需要运行编译

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

使用附加的
-DMDB\u USE\u ROBUST=0
标志。是否可以通过
cargo build
命令或向cargo.toml添加内容来配置此功能

我得到的错误是:

错误:无法为`liblmdb sys v0.2.2运行自定义生成命令`
原因:
进程未成功退出:`/Users/username/grin wallet/target/release/build/liblmdb-sys-b6bfc7b665736f9b/build script build`(退出代码:101)
---stdout
TARGET=Some(“AARC64 linux android”)
TARGET=Some(“AARC64 linux android”)
主机=一些(“x86_64-apple-darwin”)
TARGET=Some(“AARC64 linux android”)
TARGET=Some(“AARC64 linux android”)
主机=一些(“x86_64-apple-darwin”)
CC_aarch64-linux-android=None
CC_aarch64_linux_android=None
目标_CC=无
CC=无
TARGET=Some(“AARC64 linux android”)
主机=一些(“x86_64-apple-darwin”)
CFLAGS_aarch64-linux-android=None
CFLAGS\u aarch64\u linux\u android=None
目标值=无
CFLAGS=无
DEBUG=Some(“false”)
运行:“AARC64 linux android gcc”“-O2”“-ffunction sections”“-fdata sections”“-fPIC”“-Wall”“-Wextra”“-o”“/Users/username/grin wallet/target/AARC64 linux android/release/build/liblmdb-sys-7a2d430dc3c9f3e3/out/mdb/liblmdb/mdb.o”“-c”“mdb/liblmdb/liblmdb/mdb.c”
cargo:warning=mdb/libraries/liblmdb/mdb.c:4625:13:警告:函数“pthread_mutexttr_setrobust”的隐式声明在C99[-Wimplicit函数声明]中无效
货物:警告=| |(rc=pthread_mutexattr_setrobust(&mattr,pthread_MUTEX_ROBUST))
货物:警告=^
cargo:warning=mdb/libraries/liblmdb/mdb.c:4625:49:错误:使用未声明的标识符“PTHREAD\u MUTEX\u ROBUST”
货物:警告=| |(rc=pthread_mutexattr_setrobust(&mattr,pthread_MUTEX_ROBUST))
货物:警告=^
cargo:warning=mdb/libraries/liblmdb/mdb.c:9821:33:warning:unused参数'env'[-Wunused参数]
cargo:warning=mdb_env_get_maxkeysize(mdb_env*env)
货物:警告=^
cargo:warning=mdb/libraries/liblmdb/mdb.c:10002:10:警告:函数“pthread_mutex_consistent”的隐式声明在C99[-Wimplicit函数声明]中无效
货物:警告=rc2=mdb_互斥体_一致(互斥体);
货物:警告=^
cargo:warning=mdb/libraries/liblmdb/mdb.c:351:37:注意:从宏“mdb\u mutex\u consistent”展开
cargo:warning=#定义mdb_互斥体_一致(互斥体)pthread_互斥体_一致(互斥体)
货物:警告=^
货物:警告=生成3个警告和1个错误。
退出代码:1

您不能只构建和瞄准linex android,另一种方法是通过android Studio或使用Flatter开发应用程序。首先,确保安装了所有android构建目标:

rustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android
然后
安装货物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
请注意,对于NDK的较新版本,编译器必须指定为clang,因为GCC在android工具链中已被弃用,并且不再存在(一些项目默认情况下尝试引用GCC)

然后是其余的变量

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项目中,需要在与.toml文件相同的目录中创建.config目录。在.config目录中,您需要创建一个配置文件

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


看起来,您正在使用cc板条箱。看到你编译库的代码会很好,例如你的
build.rs
。尽管要求获得奖励,但这是非常粗鲁的:什么是linex android?你的职位需要延长。很多这么多关键信息丢失了,例如,如何将锈迹代码包含到Android Studio或Flatter中。请再说一遍?你到底想告诉我什么?
export CFLAGS=-DMDB_USE_ROBUST=0
[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