【问题标题】:Failing to cross-compile c++ library with Android NDK无法使用 Android NDK 交叉编译 c++ 库
【发布时间】:2021-09-07 01:49:30
【问题描述】:

该库在 linux (Ubuntu 20.04.2 LTS 64) 中完美编译,但在尝试为 android 编译时失败。 使用的程序:

$ git https://github.com/ufz/iphreeqc 
$ cd iphreeqc 
$ mkdir output 
$ export ANDROID_NDK=$ANDROID_SDK_ROOT/ndk/22.1.7171670 
$ PATH=$PATH:$ANDROID_NDK 
$ export TOOLCHAIN=$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64 
$ export TARGET=armv7a-linux-androideabi 
$ export API=21 
$ export AR=$TOOLCHAIN/bin/llvm-ar 
$ export CC=$TOOLCHAIN/bin/$TARGET$API-clang 
$ export AS=$CC 
$ export CXX=$TOOLCHAIN/bin/$TARGET$API-clang++ 
$ export LD=$TOOLCHAIN/bin/ld 
$ export RANLIB=$TOOLCHAIN/bin/llvm-ranlib 
$ export STRIP=$TOOLCHAIN/bin/llvm-strip 
$ ./configure --prefix=$(pwd)/output --host $TARGET --disable-shared 
$ make       

此后的输出和错误。 非常感谢任何帮助

全部在 src make[1]: 进入目录'/home/hery/Downloads/iphreeqc/src' CXX CSelectedOutput.lo CXX IPhreeqc.lo CXX IPhreeqc_interface_F.lo CXX IPhreeqcLib.lo CXX phreeqcpp/advection.lo CXX phreeqcpp/basicsubs.lo CXX phreeqcpp/cl1.lo CXX phreeqcpp/common/Parser.lo CXX phreeqcpp/common/PHRQ_base.lo CXX phreeqcpp/common/PHRQ_io.lo CXX phreeqcpp/common/Utils.lo CXX phreeqcpp/cvdense.lo phreeqcpp/cvdense.cpp:76:9: 警告:'malloc' 宏重新定义 [-Wmacro-redefined] #define malloc PHRQ_malloc ^ :31:9: 注意:之前的定义在这里 #define malloc rpl_malloc ^ 生成 1 个警告。 CXX phreeqcpp/cvode.lo phreeqcpp/cvode.cpp:76:9: 警告:'malloc' 宏重新定义 [-Wmacro-redefined] #define malloc MACHENV_MALLOC PHRQ_malloc ^ :31:9: 注意:之前的定义在这里 #define malloc rpl_malloc ^ 生成 1 个警告。 CXX phreeqcpp/cxxKinetics.lo CXX phreeqcpp/cxxMix.lo CXX phreeqcpp/dense.lo CXX phreeqcpp/Dictionary.lo CXX phreeqcpp/dumper.lo CXX phreeqcpp/Exchange.lo CXX phreeqcpp/ExchComp.lo CXX phreeqcpp/GasComp.lo CXX phreeqcpp/gases.lo CXX phreeqcpp/GasPhase.lo CXX phreeqcpp/input.lo CXX phreeqcpp/integrate.lo CXX phreeqcpp/inverse.lo phreeqcpp/inverse.cpp:5319:9:警告:常数 -1 与 'char' 类型表达式的比较结果始终为真 [-Wtautological-常量超出范围比较] if (c != EOF && c != '\n' && i != MAX_LINE) ~ ^ ~~~ phreeqcpp/inverse.cpp:5343:9:警告:常数 -1 与 'char' 类型表达式的比较结果始终为假 [-Wtautological-常量超出范围比较] 如果(c == EOF) ~ ^ ~~~ 生成 2 个警告。 CXX phreeqcpp/ISolution.lo CXX phreeqcpp/ISolutionComp.lo CXX phreeqcpp/isotopes.lo CXX phreeqcpp/动力学.lo CXX phreeqcpp/KineticsComp.lo CXX phreeqcpp/mainsubs.lo CXX phreeqcpp/model.lo phreeqcpp/model.cpp:3364:8:错误:命名空间“std”中没有名为“isfinite”的成员;你的意思是“有限”吗? if (!PHR_ISFINITE((double) delta[i])) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ../src/phreeqcpp/Phreeqc.h:2041:29:注意:从宏“PHR_ISFINITE”扩展而来 # 定义 PHR_ISFINITE(x) std::isfinite(x) ^~~~~ /home/hery/Android/Sdk/ndk/22.1.7171670/toolchains/llvm/prebuilt/linux-x86_64/bin/../sysroot/usr/include/math.h:373:5: 注意:这里声明了'finite' int 有限(双 __x)__attribute_const__; ^ phreeqcpp/model.cpp:3559:8:错误:命名空间“std”中没有名为“isfinite”的成员;你的意思是“有限”吗? if (!PHR_ISFINITE((double) delta[i])) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ../src/phreeqcpp/Phreeqc.h:2041:29:注意:从宏“PHR_ISFINITE”扩展而来 # 定义 PHR_ISFINITE(x) std::isfinite(x) ^~~~~ /home/hery/Android/Sdk/ndk/22.1.7171670/toolchains/llvm/prebuilt/linux-x86_64/bin/../sysroot/usr/include/math.h:373:5: 注意:这里声明了'finite' int 有限(双 __x)__attribute_const__; ^ phreeqcpp/model.cpp:4990:10:错误:命名空间“std”中没有名为“isfinite”的成员;你的意思是“有限”吗? 如果(!PHR_ISFINITE((双)f)) ^~~~~~~~~~~~~~~~~~~~~~~~~~~ ../src/phreeqcpp/Phreeqc.h:2041:29:注意:从宏“PHR_ISFINITE”扩展而来 # 定义 PHR_ISFINITE(x) std::isfinite(x) ^~~~~ /home/hery/Android/Sdk/ndk/22.1.7171670/toolchains/llvm/prebuilt/linux-x86_64/bin/../sysroot/usr/include/math.h:373:5: 注意:这里声明了'finite' int 有限(双 __x)__attribute_const__; ^ phreeqcpp/model.cpp:5050:12:错误:命名空间“std”中没有名为“isfinite”的成员;你的意思是“有限”吗? if (PHR_ISFINITE((double) d1) /*&& d1 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ ../src/phreeqcpp/Phreeqc.h:2041:29:注意:从宏“PHR_ISFINITE”扩展而来 # 定义 PHR_ISFINITE(x) std::isfinite(x) ^~~~~ /home/hery/Android/Sdk/ndk/22.1.7171670/toolchains/llvm/prebuilt/linux-x86_64/bin/../sysroot/usr/include/math.h:373:5: 注意:这里声明了'finite' int 有限(双 __x)__attribute_const__; ^ phreeqcpp/model.cpp:5733:10:错误:命名空间“std”中没有名为“isfinite”的成员;你的意思是“有限”吗? if (!PHR_ISFINITE(my_array[j * (count_unknowns + 1) + i])) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~ ../src/phreeqcpp/Phreeqc.h:2041:29:注意:从宏“PHR_ISFINITE”扩展而来 # 定义 PHR_ISFINITE(x) std::isfinite(x) ^~~~~ /home/hery/Android/Sdk/ndk/22.1.7171670/toolchains/llvm/prebuilt/linux-x86_64/bin/../sysroot/usr/include/math.h:373:5: 注意:这里声明了'finite' int 有限(双 __x)__attribute_const__; ^ 产生 5 个错误。 make[1]: *** [Makefile:1056: phreeqcpp/model.lo] 错误 1 make[1]: 离开目录 '/home/hery/Downloads/iphreeqc/src' make: *** [Makefile:400: all-recursive] 错误 1

【问题讨论】:

  • 您是否包含<cmath>?请提供一个最小示例和您的代码。
  • std::isfinite 是在 C++11 中添加的。你是用-std=c++11 或更高版本编译这个库吗?
  • 这是一个在世界范围内广泛使用的 c++ 库。它在 linux 平台上编译没有问题。所有代码都是公开的。
  • @Botje。我不知道:-(。我所做的只是在我的问题中!

标签: android c++ android-ndk


【解决方案1】:

编辑src/phreeqcpp/Phreeqc.h 以在#include <math.h> 下方添加#include <cmath> 使其在此处编译。

请先付款并将其作为拉取请求提交给项目!

【讨论】:

  • 干得好!它现在编译。但是当我尝试使用它时,我得到了错误:../../src/phreeqcpp/Phreeqc.cpp:2688: error: undefined reference to 'rpl_malloc'。它可能与编译时的相关警告有关。
  • 也许我在将 libiphreeqc.a 添加到 Android 项目时做错了。
  • 我已经检查了 android studio 中的其他库并且运行良好。所以错误与 iphreeqc.a lib 有关;-(
  • github.com/maxmind/libmaxminddb/issues/144 似乎相关,尤其是最后的链接提交
  • Botje,你的发现对编译这个库很有帮助。现在完成了!使用 export ac_cv_func_malloc_0_nonnull=yesexport ac_cv_func_realloc_0_nonnull=yes 解决的 MALLOC/REALLOC 问题我在 github 项目中打开了一个问题
猜你喜欢
  • 2012-12-28
  • 2013-06-11
  • 1970-01-01
  • 1970-01-01
  • 2015-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多