ndk arm64编译遇到问题

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

1 使用gunstl还是stlport

先前对c++的依赖均使用stlport库,在支持arm64后,发现编译时一直在报cmath中的错误。最后查找发现是项目中有引用<string>导致,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

处理。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值