ndk arm64编译遇到问题

最近项目要求支持arm armv7 以及arm64的平台。在编译中发现几个问题实在让人挠头。现将解决经验分享如下:

1 使用gunstl还是stlport

先前对c++的依赖均使用stlport库,在支持arm64后,发现编译时一直在报cmath中的错误。最后查找发现是项目中有引用导致,stlport是轻量级的c++库,但是没有gnustl对c++支持的到位。选用gnustl后,问题解决。如果想使用stlport还是要谨慎使用c++一些高级特性。

2 是__captured::__capture_isfinite 还是 isfinite

在继续编译时,又出现__captured::__capture_isfinite无法找到定义。先前在使用stlport是从来没有发现这种问题。通过对gnustl和stlport中cmath函数的查看,发现在stlport中是__captured::__capture_isfinite函数而在gunstl中是isfinite。立马动手解决,在Application.mk文件中根据引用不同的c++库,定义不同的宏。再在具体代码中再进行区别处理。完美解决。

3 使用curl库出现了__curl_rule_01__ is negative问题

在编译arm64的curl库时出现了__curl_rule_01__ is negative问题,发现是#define CurlchkszEQ(t, s) sizeof(t) == s ? 1 : -1,具体就是CurlchkszEQ(long, CURL_SIZEOF_LONG)计算出了问题。也就是对对CURL_SIZEOF_LONG的定义与系统得到long长度不一致。类型通过sizeof计算时不匹配导致。原有curlbuild.h中对各个arm平台定义不够全面。针对arm64在curlbuild.h中增加:

#if defined(__aarch64__)
#    define CURL_SIZEOF_LONG           8
#    define CURL_TYPEOF_CURL_OFF_T     long
#    define CURL_FORMAT_CURL_OFF_T     "ld"
#    define CURL_FORMAT_CURL_OFF_TU    "lu"
#    define CURL_FORMAT_OFF_T          "%ld"
#    define CURL_SIZEOF_CURL_OFF_T     8
#    define CURL_SUFFIX_CURL_OFF_T     L
#    define CURL_SUFFIX_CURL_OFF_TU    UL

#endif

处理。

你可能感兴趣的:(编译相关)