您尚未登录。

#1 2023-08-10 17:39:32

shihchieh_ma
会员
注册时间: 2023-06-15
帖子: 9

[SOLVED]react-native编译在arch中会报错:skipping incompatible

各位大佬好哈:
     
react-native url :https://github.com/facebook/react-native/archive/refs/tags/v0.66.0-rc.3.zip
我需要修改react-native中部分java代码,然后对它的ReactAndroid模块进行重新打包一个aar给android开发人员使用。aar中至少应该包含"armeabi-v7a", "arm64-v8a"这俩个架构的so后缀的动态库的,手机用这俩。 但是在编译过程中出现了一个错误,错误信息如下:

/home/masj/.Library/android-sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/linux-x86_64/bin/../lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin/ld: skipping incompatible /usr/lib/libatomic.so when searching for -latomic
/home/masj/.Library/android-sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/linux-x86_64/bin/../lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin/ld: skipping incompatible /usr/lib/libc.so when searching for -lc
/home/masj/.Library/android-sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/linux-x86_64/bin/../lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin/ld: skipping incompatible /usr/lib/libc.a when searching for -lc
/home/masj/.Library/android-sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/linux-x86_64/bin/../lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin/ld: skipping incompatible /usr/lib/libm.so when searching for -lm
/home/masj/.Library/android-sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/linux-x86_64/bin/../lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin/ld: skipping incompatible /usr/lib/libm.a when searching for -lm
/home/masj/.Library/android-sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/linux-x86_64/bin/../lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin/ld: skipping incompatible /usr/lib/libm.so when searching for -lm
/home/masj/.Library/android-sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/linux-x86_64/bin/../lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin/ld: skipping incompatible /usr/lib/libm.a when searching for -lm
/home/masj/.Library/android-sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/linux-x86_64/bin/../lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin/ld: skipping incompatible /usr/lib/libc.so when searching for -lc
/home/masj/.Library/android-sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/linux-x86_64/bin/../lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin/ld: skipping incompatible /usr/lib/libc.a when searching for -lc
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [/home/masj/.Library/android-sdk/ndk/21.4.7075529/build/core/build-binary.mk:725: /home/masj/Projects/android/react-native-0.66.3/react-native-0.66.0-rc.3/ReactAndroid/build/tmp/buildReactNdkLib/local/arm64-v8a/libreact_debug.so] Error 1
make: *** Waiting for unfinished jobs....

我只大概知道这种是工具链,库啥的架构不匹配导致的问题,然后用file命令看了几个文件:

$ file /home/masj/.Library/android-sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/linux-x86_64/bin/../lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin/ld
/home/masj/.Library/android-sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/linux-x86_64/bin/../lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin/ld: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.24, stripped

$ file /usr/lib/libatomic.so
/usr/lib/libatomic.so: symbolic link to libatomic.so.1.2.0

$ file /usr/lib/libatomic.so.1.2.0
/usr/lib/libatomic.so.1.2.0: ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), dynamically linked, BuildID[sha1]=c6e8412dcbd0c334d80862ecbc9636c327339fa0, with debug_info, not stripped

$ file /usr/lib/libc.so
/usr/lib/libc.so: ASCII text

$ cat /usr/lib/libc.so
/* GNU ld script
   Use the shared library, but some functions are only in
   the static library, so try that secondarily.  */
OUTPUT_FORMAT(elf64-x86-64)
GROUP ( /usr/lib/libc.so.6 /usr/lib/libc_nonshared.a  AS_NEEDED ( /usr/lib/ld-linux-x86-64.so.2 ) )


但是这看着也都是64的好像也没啥问题,不懂怎么处理了,而且这个问题我又在fedora和debian的发行版上测试了一下,同样的工程编译是没有问题的,可以打包,确定只会在arch中出现这个错误,有没有彦祖知道原因或者有什么修改建议啥的啊

最近编辑记录 shihchieh_ma (2023-08-13 23:20:57)

离线

#2 2023-08-11 00:27:59

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,485
个人网站

Re: [SOLVED]react-native编译在arch中会报错:skipping incompatible

你的工具链或者其参数有问题,没有找到工具链自带的 libc 等库。

离线

#3 2023-08-11 08:29:05

shihchieh_ma
会员
注册时间: 2023-06-15
帖子: 9

Re: [SOLVED]react-native编译在arch中会报错:skipping incompatible

依云 说:

你的工具链或者其参数有问题,没有找到工具链自带的 libc 等库。


工具用的是android-sdk andoid-ndk这些, react native 那个代码里也没有改啥参数,就很奇怪在fedrora和debian中测试打包确实没问题,不知道在arch中是不是需要什么额外的设置或者软件包。
我甚至在别的电脑装了个arch的虚拟机测试,也是这种错误,很迷惑,根本不知道为啥。。。

离线

#4 2023-08-11 09:05:44

matrikslee
会员
注册时间: 2017-04-21
帖子: 442
个人网站

Re: [SOLVED]react-native编译在arch中会报错:skipping incompatible

你到你系统上的 /home/masj/.Library/android-sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt 这个目录下看看除了linux-x86_64之外还有没有别的目录,很显然你要的是带arm字样的目录内容

离线

#5 2023-08-11 11:42:52

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,485
个人网站

Re: [SOLVED]react-native编译在arch中会报错:skipping incompatible

andoid-ndk 我记得需要手动跑 make-standalone-toolchain.sh 脚本来创建你指定的 target 的工具链的。

离线

#6 2023-08-11 19:37:49

shihchieh_ma
会员
注册时间: 2023-06-15
帖子: 9

Re: [SOLVED]react-native编译在arch中会报错:skipping incompatible

matrikslee 说:

你到你系统上的 /home/masj/.Library/android-sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt 这个目录下看看除了linux-x86_64之外还有没有别的目录,很显然你要的是带arm字样的目录内容


ndk/21.4.7075529/toolchains/llvm/prebuilt/linux-x86_64目录下有:
drwxr-xr-x 5 masc users   4096 Aug  8 00:09 aarch64-linux-android
-rw-r--r-- 1 masc users     25 Aug  8 00:09 AndroidVersion.txt
drwxr-xr-x 4 masc users   4096 Aug  8 00:09 arm-linux-androideabi
drwxr-xr-x 2 masc users  12288 Aug  8 00:09 bin
drwxr-xr-x 4 masc users   4096 Aug  8 00:09 i686-linux-android
drwxr-xr-x 3 masc users   4096 Aug  8 00:09 include
drwxr-xr-x 6 masc users   4096 Aug  8 00:09 lib
drwxr-xr-x 3 masc users   4096 Aug  8 00:10 lib64
drwxr-xr-x 2 masc users   4096 Aug  8 00:10 libexec
-rw-r--r-- 1 masc users   5583 Aug  8 00:10 manifest_7019983.xml
-rw-r--r-- 1 masc users      0 Aug  8 00:09 MODULE_LICENSE_BSD_LIKE
-rw-r--r-- 1 masc users      0 Aug  8 00:09 MODULE_LICENSE_MIT
-rw-r--r-- 1 masc users 130424 Aug  8 00:09 NOTICE
drwxr-xr-x 3 masc users   4096 Aug  8 00:10 prebuilt_include
drwxr-xr-x 8 masc users   4096 Aug  8 00:10 share
drwxr-xr-x 3 masc users   4096 Aug  8 00:10 sysroot
drwxr-xr-x 5 masc users   4096 Aug  8 00:10 test
drwxr-xr-x 5 masc users   4096 Aug  8 00:10 x86_64-linux-android


这里面aarch64应该是armv8,arm应该指的是32位armeabi-v7a,ndk中文件应该是全的,对比了下fedora里的ndk目录是一样的。所以应该不会是缺少文件或库什么的。

离线

#7 2023-08-11 20:39:41

shihchieh_ma
会员
注册时间: 2023-06-15
帖子: 9

Re: [SOLVED]react-native编译在arch中会报错:skipping incompatible

依云 说:

andoid-ndk 我记得需要手动跑 make-standalone-toolchain.sh 脚本来创建你指定的 target 的工具链的。

我去看了下这个文档:https://developer.android.com/ndk/guides/standalone_toolchain?hl=zh-cn

里面提到:
此类信息假定您已熟悉如何编译和链接原生代码。如果您是自己编写代码,则无需使用独立工具链;
在这类用例中,您应利用 NDK 支持的现有构建系统。如果要构建开源库(例如调用 configure 脚本时),应考虑使用独立的工具链。


我这个应该相当于类似自己编写代码那种情况,应该不用配置这个的。同时我在mac、fedora、debian去测试编译打包这个react-native的时候也不用配置指定工具链什么的。
我本来都在想会不会是因为arch本身只支持x86_64,然后天生会缺少什么东西导致这种情况,然后去建了一个android的空工程,看了下打包的apk。里面架构是全的,所以现在只能怀疑是不是react-native工程里面有什么配置和arch本身不匹配了。

离线

#8 2023-08-11 23:21:34

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,485
个人网站

Re: [SOLVED]react-native编译在arch中会报错:skipping incompatible

我没管它里边讲的什么。不管是 Android NDK 还是你自己找来的工具链,你总是得用一个。然后你如果用 Android NDK 的话,就需要用它的脚本来构建指定版本的工具链。直接用是会有问题的。

离线

#9 2023-08-13 20:45:29

shihchieh_ma
会员
注册时间: 2023-06-15
帖子: 9

Re: [SOLVED]react-native编译在arch中会报错:skipping incompatible

依云 说:

我没管它里边讲的什么。不管是 Android NDK 还是你自己找来的工具链,你总是得用一个。然后你如果用 Android NDK 的话,就需要用它的脚本来构建指定版本的工具链。直接用是会有问题的。

嗯,我理解你说的意思,你说的相当于把ndk独立拎出来使用的,指定架构和链接去编。我试了把4个架构都用类似如下命令创建并添加到系统变量, xxx/./make-standalone-toolchain.sh --platform=android-21 --install-dir=/home/masj/Tmp/android-aarch64(x86..4种) --arch=arm64 (x86..4种)  然后是同样的错误。。。
react-native源码是可以用android studio打开的,里面结合Application.mk和gradle指定架构,通常都是arm armv8 x86 x86_64都有的,这样最终一个aar打包出来里面.so动态库是全的。看了下RN的文档说明:https://reactnative.cn/docs/0.67/building-from-source    这里面其实也没说再去指定什么,结合在fedora和debian的测试打包,对于react-native工程应该确实不需要指定工具链这种操作的,本身工程指向ndk和配置好需要架构就行。
感觉还是懂得太少了,这种完全不知道从什么角度去切入定位问题。先用fedora打包凑合了。

离线

#10 2023-08-13 20:59:33

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,485
个人网站

Re: [SOLVED]react-native编译在arch中会报错:skipping incompatible

感觉还是懂得太少了,这种完全不知道从什么角度去切入定位问题。先用fedora打包凑合了。

基本上就看调用的命令的参数,看构建脚本。

离线

#11 2023-08-13 21:51:14

shihchieh_ma
会员
注册时间: 2023-06-15
帖子: 9

Re: [SOLVED]react-native编译在arch中会报错:skipping incompatible

依云 说:

感觉还是懂得太少了,这种完全不知道从什么角度去切入定位问题。先用fedora打包凑合了。

基本上就看调用的命令的参数,看构建脚本。

我靠,好了,里面有个配置:
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog

我注释换成了:
ifeq ($(APP_ABI),armeabi-v7a)
  LOCAL_LDLIBS += -L/home/masj/.Library/android-sdk/ndk/21.4.7075529/platforms/android-21/arch-arm/usr/lib  -llog
else ifeq ($(APP_ABI),arm64-v8a)
  LOCAL_LDLIBS += -L/home/masj/.Library/android-sdk/ndk/21.4.7075529/platforms/android-21/arch-arm64/usr/lib  -llog
else ifeq ($(APP_ABI),x86)
  LOCAL_LDLIBS += -L/home/masj/.Library/android-sdk/ndk/21.4.7075529/platforms/android-21/arch-x86/usr/lib  -llog
else ifeq ($(APP_ABI),x86_64)
  LOCAL_LDLIBS += -L/home/masj/.Library/android-sdk/ndk/21.4.7075529/platforms/android-21/arch-x86_64/usr/lib  -llog
endif

就可以了,感觉这玩意好像在arch中找的是错的,但是在debian和fedroa可以正确找到。

离线

#12 2023-08-13 22:03:55

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,485
个人网站

Re: [SOLVED]react-native编译在arch中会报错:skipping incompatible

那是你的 SYSROOT 变量出错了吧。找找它是怎么定义的,是不是你少装了什么命令。

离线

#13 2023-08-13 22:13:56

shihchieh_ma
会员
注册时间: 2023-06-15
帖子: 9

Re: [SOLVED]react-native编译在arch中会报错:skipping incompatible

依云 说:

那是你的 SYSROOT 变量出错了吧。找找它是怎么定义的,是不是你少装了什么命令。

刚看了,arch中工程和环境变量没有这个定义,没有默认应该是根目录,然后我在fedrao中看了下,也没有。。。很迷

然后问了下new bing,说Fedora 默认的 SYSROOT 取决于使用的编译器和目标平台,但是arch貌似不会,可能涉及到发行版的优化吧。然后这样就会导致arch链接是错的。

离线

页脚