not found libc++.so

问题:install 安装依赖有so库的apk,无法正常加载so。报错:not found libc++.so
比如:System.loadLibrary(“InitTest”);

分析:

  1. 工具在 android/prebuilts/tools/gcc-sdk,运行下面命令:
    readelf -dW libInitTest.so
    可以查看 libInitTest.so 的动态依赖库。其中依赖了 libc++.so

  2. Android N 开始,Google收缩了 so 库的依赖权限。只有 system/app system/priv-app 下的应用可以依赖。data/app 下的安装应用是无法加载某些 so 库的。
    如下 /system/etc/public.libraries.txt 中是动态依赖库的白名单。 libc++.so 不在其中。

libandroid.so
libaaudio.so
libamidi.so
libbinder_ndk.so
libc.so
libcamera2ndk.so
libdl.so
libEGL.so
libGLESv1_CM.so
libGLESv2.so
libGLESv3.so
libicui18n.so
libicuuc.so
libjnigraphics.so
liblog.so
libmediandk.so
libm.so
libnativewindow.so
libneuralnetworks.so
libOpenMAXAL.so
libOpenSLES.so
libRS.so
libstdc++.so
libsync.so
libvulkan.so
libwebviewchromium_plat_support.so
libz.so

方案一:
在白名单中加上 libc++.so

方案二:
在 libInitTest.so 的源码 Android.mk 中加上如下配置:

LOCAL_NDK_STL_VARIANT := c++_static
LOCAL_SDK_VERSION := 8

方案三:
在自己的 app 中把 libc++.so 复制到 libInitTest.so 同级目录,生成apk。

### 下载并安装 `libc++1.dylib` 文件的方法 #### 背景说明 `libc++1.dylib` 是 macOS 和 iOS 开发环境中常用的 C++ 标准库实现之一。它通常由 Xcode 提供,作为开发工具链的一部分自动管理。如果需要手动获取该文件,则可能是因为某些特定需求(如兼容性测试或修复缺失的动态链接库)。以下是具体的操作方法。 --- #### 方法一:通过 Xcode 获取 `libc++1.dylib` Xcode 自带了完整的标准库实现,可以通过以下方式提取: 1. **定位 Xcode 中的标准库路径** - 打开终端,输入以下命令查找 `libc++1.dylib` 的位置: ```bash find /Applications/Xcode.app -name "libc++.dylib" ``` 这会返回类似 `/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/c++/v1/libc++.dylib` 的路径[^1]。 2. **复制到目标目录** - 使用 `cp` 命令将文件复制到指定目录(如 `/usr/lib` 或项目根目录): ```bash sudo cp /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/c++/v1/libc++.dylib /usr/lib/libc++1.dylib ``` 3. **验证文件是否存在** - 输入以下命令确认文件已成功复制: ```bash ls -l /usr/lib/libc++1.dylib ``` --- #### 方法二:从官方源码构建 `libc++1.dylib` 如果无法通过 Xcode 获取,可以尝试从 LLVM 官方仓库编译生成: 1. **克隆 LLVM 仓库** - 执行以下命令下载最新版本的 LLVM 源码: ```bash git clone https://github.com/llvm/llvm-project.git cd llvm-project ``` 2. **配置和编译** - 创建一个构建目录并执行 cmake 配置: ```bash mkdir build && cd build cmake -DLLVM_ENABLE_PROJECTS=libcxx ../llvm make libc++ ``` 3. **生成 `.dylib` 文件** - 编译完成后,可以在 `build/projects/libcxx/lib` 目录下找到生成的动态库文件。将其重命名为 `libc++1.dylib` 并移动至所需位置: ```bash mv build/projects/libcxx/lib/libc++.so /usr/lib/libc++1.dylib ``` --- #### 方法三:解决常见问题 - **动态链接失败** 如果遇到类似于 `library not found for -lc++1` 的错误,可能是由于环境变量未设置正确。需确保 `DYLD_LIBRARY_PATH` 包含新生成的动态库路径: ```bash export DYLD_LIBRARY_PATH=/usr/lib:$DYLD_LIBRARY_PATH ``` - **替换旧版库** 若现有项目依赖于过时的 `libstdc++` 库,建议按照推荐的方式迁移至 `libc++`[^3]。这包括更新代码中的头文件引用以及重新编译受影响的模块。 --- #### 注意事项 - 动态库的命名应遵循平台约定,例如 macOS 上通常使用 `.dylib` 后缀而非其他形式。 - 修改系统级库(如 `/usr/lib`)前务必备份原始文件以防意外损坏操作系统功能[^5]。 ```python import os os.system('sudo cp source_path target_path') # 示例代码用于演示文件复制操作 ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值