各位大佬好哈:
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)
离线
你的工具链或者其参数有问题,没有找到工具链自带的 libc 等库。
离线
你的工具链或者其参数有问题,没有找到工具链自带的 libc 等库。
工具用的是android-sdk andoid-ndk这些, react native 那个代码里也没有改啥参数,就很奇怪在fedrora和debian中测试打包确实没问题,不知道在arch中是不是需要什么额外的设置或者软件包。
我甚至在别的电脑装了个arch的虚拟机测试,也是这种错误,很迷惑,根本不知道为啥。。。
离线
你到你系统上的 /home/masj/.Library/android-sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt 这个目录下看看除了linux-x86_64之外还有没有别的目录,很显然你要的是带arm字样的目录内容
离线
andoid-ndk 我记得需要手动跑 make-standalone-toolchain.sh 脚本来创建你指定的 target 的工具链的。
离线
你到你系统上的 /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目录是一样的。所以应该不会是缺少文件或库什么的。
离线
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本身不匹配了。
离线
我没管它里边讲的什么。不管是 Android NDK 还是你自己找来的工具链,你总是得用一个。然后你如果用 Android NDK 的话,就需要用它的脚本来构建指定版本的工具链。直接用是会有问题的。
离线
我没管它里边讲的什么。不管是 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打包凑合了。
离线
感觉还是懂得太少了,这种完全不知道从什么角度去切入定位问题。先用fedora打包凑合了。
基本上就看调用的命令的参数,看构建脚本。
离线
感觉还是懂得太少了,这种完全不知道从什么角度去切入定位问题。先用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可以正确找到。
离线
那是你的 SYSROOT 变量出错了吧。找找它是怎么定义的,是不是你少装了什么命令。
离线
那是你的 SYSROOT 变量出错了吧。找找它是怎么定义的,是不是你少装了什么命令。
刚看了,arch中工程和环境变量没有这个定义,没有默认应该是根目录,然后我在fedrao中看了下,也没有。。。很迷
然后问了下new bing,说Fedora 默认的 SYSROOT 取决于使用的编译器和目标平台,但是arch貌似不会,可能涉及到发行版的优化吧。然后这样就会导致arch链接是错的。
离线