问题点1: -lstdc++ 与libc++_shared.so的关联;
当在makefile中引入-lstdc++时,其意味着调用动态库libstdc++.so,
Note:动态库libstdc++.so 所对应的静态库是libstdc++.a;
Note:当前测试libstdc++.so来自于Android12的./prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.17-4.8/x86_64-linux/lib64文件夹
使用指令objdump -x libstdc++.so |grep NEEDED看到其并没有直接引用libc++_shared.so,
测试(测试工具链为android-ndk-r25b):
Case 1): 在自定义ABC.so的makefile中添加-lstdc++,即调用libstdc++.so,
compile出ABC.so 后,使用“objdump -x libABC.so |grep NEEDED”,可以看到其需链接
libc++_shared.so;
Case 2): 在自定义ABC.so的makefile中通过-Xlinker "-(" -lstdc++ -Xlinker "-)"形式,即调用libstdc++.a, compile出ABC.so 后,使用“objdump -x libABC.so |grep NEEDED”,可以看到其同样需链接libc++_shared.so;
小结:不论调用libstdc++.so 还是libstdc++.a,compile出的自定义so都需链接
libc++_shared.so(测试结果基于Android12);
问题点2:-lc++ 与libc++_shared.so的关联;
当在makefile中引入-lc++时,其意味着调用动态库libc++.so,
Note:动态库libc++.so 所对应的静态库是libc++_static.a;
libc++.so和libc++_static.a来自于Android12,
其中libc++_static.a具体来自于./prebuilts/ndk/current/sources/cxx-stl/llvm-libc++/libs/文件夹下
测试(测试工具链为android-ndk-r25b):
Case 3): 在自定义ABC.so的makefile中添加-lc++,即调用libc++.so,
compile出ABC.so 后,使用“objdump -x libABC.so |grep NEEDED”,可以看到其需链接
libc++_shared.so;
Case 4): 在自定义ABC.so的makefile中通过-Xlinker "-(" -lc++_static -Xlinker "-)"形式,即调用libc++_static.a, compile出ABC.so 后,使用“objdump -x libABC.so |grep NEEDED”,可以看到其不需链接libc++_shared.so;
结论:以上4种测试case中,唯一不需链接libc++_shared.so的只有libc++_static.a
且在Android12 源码中,也能找到其为了避开libc++_shared.so,而使用
libc++_static.a的例子;
’如:./package/modules/NetworkStack/Android.bp中,