Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Android 64位动态库编译报错:unknown value 'arm64-v8a' for -march #695

Closed
Zliu404 opened this issue Mar 6, 2020 · 5 comments
Closed
Milestone

Comments

@Zliu404
Copy link

Zliu404 commented Mar 6, 2020

描述问题

xmake v2.3.1+202002232035

测试Android动态库,armeabi-v7a(arch:armv7-a)编译成功,arm64-v8a(arch:arm64-v8a)编译失败,提示 unknown value 'arm64-v8a' for -march

期待的结果

编译成功

错误信息

armv7-a 成功:
image

arm64-v8a失败:
image

相关环境

configure
{
    sh = /Users/xxx/Documents/DevTools/android-ndk-r10e/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin/aarch64-linux-android-g++
    ndk = /Users/xxx/Documents/DevTools/android-ndk-r10e/
    ndk_stdcxx = true
    host = macosx
    libname = test
    buildir = build
    ndk_toolchains_ver = 4.9
    ndk_sdkver = 21
    arch = arm64-v8a
    plat = android
    build_toolver = 29.0.2
    clean = true
    ccache = true
    mode = release
    bin = /Users/xxx/Documents/DevTools/android-ndk-r10e/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin
    cross = aarch64-linux-android-
    kind = shared
    ld = /Users/xxx/Documents/DevTools/android-ndk-r10e/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64/bin/aarch64-linux-android-g++
    android_sdk = ~/Library/Android/sdk
    sdk = ~/Library/Android/sdk
    gcc_toolchain = /Users/xxx/Documents/DevTools/android-ndk-r10e/toolchains/aarch64-linux-android-4.9/prebuilt/darwin-x86_64
}

其他信息

猜测,gcc编译参数使用的 -march 应该为 armv8-a,而 xmake arch 参数输入 arm64-v8a,中间存在转换?

arch 使用 armv8-a 的情况,导致cpu类型出错。。
image

@waruqi
Copy link
Member

waruqi commented Mar 6, 2020

你的ndk版本太老 早期我有加armv8-a的,后来ndk版本迭代这么多版本,早都不用armv8-a了 所以我后来就给删了,新版本ndk都是arm64-v8a 。一种就是你升级下ndk版本,一种就是等后面有时间我看看,再加回去也是可以的

google ndk abi文档里面也不再有armv8-a了
https://developer.android.google.cn/ndk/guides/abis?hl=zh-cn

@Zliu404
Copy link
Author

Zliu404 commented Mar 7, 2020

你的ndk版本太老 早期我有加armv8-a的,后来ndk版本迭代这么多版本,早都不用armv8-a了 所以我后来就给删了,新版本ndk都是arm64-v8a 。一种就是你升级下ndk版本,一种就是等后面有时间我看看,再加回去也是可以的

google ndk abi文档里面也不再有armv8-a了
https://developer.android.google.cn/ndk/guides/abis?hl=zh-cn

高版本的 NDK是可以的, 使用 llvm 编译没有这个问题,arm64可以成功。

能否解释一下xmake 定义的 Android arch 与 ABI 的对应关系呢?xmake的部分定义(例如,armv7-a)好像不太符合Android开发习惯。
google 官方的ABI :armeabi(已废弃)、armeabi-v7a、arm64-v8a、x86、x86_64
xmake 定义的 Android arch:armv5te、armv7-a、arm64-v8a、 i386、x86_64

@waruqi
Copy link
Member

waruqi commented Mar 7, 2020

armv5te对应armeabi armeabi-v7a对应armv7-a, i386对应x86

好像不太符合Android开发习惯。

只要知道映射关系就好,其实看字面也能知道个大概,主要是得统一成xmake里面的规范,方便不同平台间 arch统一处理 简化维护成本

如果完全跟android同步命名,会很被动,google一改arch名,比如新版ndk armv8-a变成了arm64-v8a,这边xmake很多逻辑就都会受影响,也得跟着同步,甚至用户的xmake.lua里面对is_arch("armv8-a")的配置逻辑也会随ndk版本而影响

像conan/vcpkg这种你可以看下 也都是自己约定的命名做的映射

不过像armv5te这种也是历史遗留原因,因为最初搞的时候,ndk版本还很低,那个时候是存在armv5te的 还有armv6了,后来ndk才统一搞成了armeabi 关于这块,虽然有历史原因,但暂时我不想动了,毕竟新版ndk都没armeabi了,原本之后逐步废弃的,改了还会影响现有xmake.lua的一些配置

只要知道映射关系就好

@waruqi
Copy link
Member

waruqi commented Mar 12, 2020

那个r10e的低版本问题,我也兼容处理过了,直接传 -a arm64-v8a也能正常编译了,你可以更新到dev版本试试

xmake update dev

@waruqi waruqi closed this as completed Mar 14, 2020
@waruqi waruqi added this to the v2.3.2 milestone Mar 14, 2020
@waruqi
Copy link
Member

waruqi commented Mar 27, 2020

这块我dev分支上改进过了,采用android ndk最新的abi命令规范,目前支持:armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, mips, mips64

这块具体参考google abi标准:https://developer.android.google.cn/ndk/guides/abis

另外原有的armv5te, armv7-a, i386, mips, mips64也会做兼容支持。。

其中armv5te是很老的ndk版本才提供的,所以当初加上后没怎么去动,它对应r16b ndk就是armeabi,不过armeabi在r17上也废弃了,但还是先支持一段时间吧。。

armv7-a/i386 对应armeabi-v7a/x86 我对这两目前还是做了向下兼容支持,但是默认检测arch,会使用armeabi-v7a。。

mips/mips64同样在r17上呗移除了,不过xmake对老版本ndk中,这块还是兼容支持的。。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants