无法使用 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>
使其在此处编译。
请转发并将其作为拉取请求提交给项目!
库在 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>
使其在此处编译。
请转发并将其作为拉取请求提交给项目!