无法使用 Android NDK 交叉编译 C++ 库

Failing to cross-compile c++ library with Android NDK

库在 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-constant-out-of-range-compare]
                    如果 (c != EOF && c != '\n' && i != MAX_LINE)
    ~^~~~
    phreeqcpp/inverse.cpp:5343:9: 警告:常量-1 与类型表达式的比较结果“char”始终为假 [-Wtautological-constant-out-of-range-compare]
                    如果(c == EOF)
    ~^~~~
    生成了 2 个警告。
      CXX phreeqcpp/ISolution.lo
      CXX phreeqcpp/ISolutionComp.lo
      CXX phreeqcpp/isotopes.lo
      CXX phreeqcpp/kinetics.lo
      CXX phreeqcpp/KineticsComp.lo
      CXX phreeqcpp/mainsubs.lo
      CXX phreeqcpp/model.lo
    phreeqcpp/model.cpp:3364:8: 错误:命名空间“std”中没有名为“isfinite”的成员;您指的是“有限”吗?
                    如果 (!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:注:此处声明“有限”
    int finite(double __x) __attribute_const__;
    ^
    phreeqcpp/model.cpp:3559:8: 错误:命名空间“std”中没有名为“isfinite”的成员;您指的是“有限”吗?
                    如果 (!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:注:此处声明“有限”
    int finite(double __x) __attribute_const__;
    ^
    phreeqcpp/model.cpp:4990:10: 错误:命名空间“std”中没有名为“isfinite”的成员;您指的是“有限”吗?
                                    如果 (!PHR_ISFINITE((double) 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:注:此处声明“有限”
    int finite(double __x) __attribute_const__;
    ^
    phreeqcpp/model.cpp:5050:12: 错误:命名空间“std”中没有名为“isfinite”的成员;您指的是“有限”吗?
                                                            如果 (PHR_ISFINITE((double) d1) /*&& d1 < 5.0*/)
    ^~~~~~~~~~~~~~~~~~~~~~~~~
    ../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:注:此处声明“有限”
    int finite(double __x) __attribute_const__;
    ^
    phreeqcpp/model.cpp:5733:10: 错误:命名空间“std”中没有名为“isfinite”的成员;您指的是“有限”吗?
                                    如果 (!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:注:此处声明“有限”
    int finite(double __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

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

请转发并将其作为拉取请求提交给项目!