C++学习(一八八)android程序编译时NDK ld: cannot find -lc++

在Android平台编译C++程序时遇到NDK链接错误ld: cannot find -lc++。解决方案是使用Android提供的libc++_shared.so库,因为libstdc++仅提供有限的C++支持且不包含STL。静态库c++_static可能导致程序体积过大,因此更推荐使用动态库c++_shared。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

j解决办法:https://forum.qt.io/topic/103713/error-cannot-find-lc-qt-5-12-android/21

QMAKE_LINK += -nostdlib++

 

Android 平台提供很小的 C++ 运行时支持库 (libstdc++)。这种很小的支持不包含如下支持:

  • 标准 C++ 库支持(几个无关紧要的标头除外)。
  • C++ 异常支持
  • RTTI 支持

NDK 提供此默认库使用的标头。此外,NDK 还提供大量可提供其他功能的帮助程序运行时。

 

 

Android使用的C++库有如下几种:

名称 说明 功能
libstdc++ 默认最小系统 C++ 运行时库  
gabi++_static GAbi++ 运行时(静态) C++ 异常和 RTTI
gabi++_shared GAbi++ 运行时(共享) C++ 异常和 RTTI
stlport_static STLport 运行时(静态) C++ 异常和 RTTI;标准库
/opt/android-ndk-r18b/toolchains/llvm/prebuilt/linux-x86_64/bin/clang --sysroot=/opt/android-ndk-r18b/sysroot -I/include -fPIC -c -o /tmp/ffconf.3S9556Zm/test.o /tmp/ffconf.3S9556Zm/test.c /opt/android-ndk-r18b/toolchains/llvm/prebuilt/linux-x86_64/bin/clang -L/lib -L/opt/android-ndk-r18b/sysroot/usr/lib -lmpp -lunwind --sysroot=/opt/android-ndk-r18b/sysroot -o /tmp/ffconf.3S9556Zm/test /tmp/ffconf.3S9556Zm/test.o /..//bin/ld: cannot find crt1.o: No such file or directory /..//bin/ld: cannot find crti.o: No such file or directory /..//bin/ld: cannot find crtbegin.o: No such file or directory /..//bin/ld: cannot find -lmpp /..//bin/ld: cannot find -lunwind /..//bin/ld: cannot find -lgcc /..//bin/ld: cannot find -lgcc_s /..//bin/ld: cannot find -lc /..//bin/ld: cannot find -lgcc /..//bin/ld: cannot find -lgcc_s /..//bin/ld: cannot find crtend.o: No such file or directory /..//bin/ld: cannot find crtn.o: No such file or directory clang: error: linker command failed with exit code 1 (use -v to see invocation) C compiler test failed.还是出现了问题,这是命令:./configure --target-os=android --arch=aarch64 --enable-cross-compile --cross-prefix=$TOOLCHAIN/bin/$TARGET$API- --sysroot=/opt/android-ndk-r18b/sysroot --cc=$TOOLCHAIN/bin/clang --cxx=$TOOLCHAIN/bin/clang++ --enable-rkmpp --enable-libdrm --extra-cflags="-I$MPP_ROOT/include -fPIC" --enable-shared --enable-version3 --disable-static --disable-doc --extra-ldflags="-L$MPP_ROOT/lib -L/opt/android-ndk-r18b/sysroot/usr/lib -lmpp -lunwind"
03-14
<think>嗯,用户遇到了编译错误,主要是链接器不到各种crt*.o文件和库文件。首先需要分析错误信息。这些crt文件是C运行时初始化文件,通常位于NDK的工具链目录中。用户使用的NDK版本是r18b,可能路径配置有问题。 检查用户的命令,发现--sysroot指向了NDK的sysroot目录,但可能缺少指定--gcc-toolchain或者正确的--sysroot路径。在NDK r18b中,clang已经默认使用libc++,但用户可能链接了错误的库路径。 另外,不到-lmpp和-lunwind,说明MPP库的路径可能没有正确传递给链接器。用户虽然用了-L$MPP_ROOT/lib,但需要确认$MPP_ROOT是否正确设置,以及这些库是否存在于该路径下。 用户可能没有正确指定目标平台和API级别,导致链接器寻错误的架构目录。需要检查cross-prefix是否正确,是否包含了正确的API级别和目标三元组。 解决方案可能需要调整sysroot指向平台特定的目录,例如添加--sysroot=$NDK/sysroot/usr/include/aarch64-linux-android,或者使用--gcc-toolchain指定工具链路径。同时,确保所有的库路径和头文件路径正确无误,可能需要显式添加-L和-I参数。</think>这个错误信息表明在交叉编译Android平台时,链接器(ld)无法到关键的运行时对象文件和依赖库。我将逐步分析问题并提供解决方案: 1. **crt*.o缺失问题**(核心运行时对象文件) - 典型路径应为:$NDK/sysroot/usr/lib/aarch64-linux-android/$API/ - 需确认: ```bash --sysroot=/opt/android-ndk-r18b/platforms/android-$API/arch-arm64 ``` 而不是直接指向NDK根目录的sysroot 2. **依赖库缺失问题**(-lmpp, -lunwind等) 需要显式指定库搜索路径: ```bash -L/opt/android-ndk-r18b/sources/third_party/mpp/lib \ -L/opt/android-ndk-r18b/sources/cxx-stl/llvm-libc++/libs/arm64-v8a ``` 3. **推荐调整编译参数**: ```bash export API=21 export TOOLCHAIN=/opt/android-ndk-r18b/toolchains/llvm/prebuilt/linux-x86_64 export TARGET=aarch64-linux-android ./configure \ --target-os=android \ --arch=aarch64 \ --enable-cross-compile \ --cross-prefix=$TOOLCHAIN/bin/$TARGET$API- \ --sysroot=$TOOLCHAIN/sysroot \ --extra-cflags="-I$MPP_ROOT/include -fPIC -target $TARGET$API -isysroot $TOOLCHAIN/sysroot" \ --extra-ldflags="-L$MPP_ROOT/lib -L$TOOLCHAIN/sysroot/usr/lib/$TARGET/$API -lmpp -lunwind -lc++_shared" \ --cc=$TOOLCHAIN/bin/clang \ --cxx=$TOOLCHAIN/bin/clang++ \ --enable-rkmpp \ --enable-libdrm \ --enable-shared \ --disable-static ``` 4. **验证工具链完整性**: ```bash ls $TOOLCHAIN/lib/gcc/$TARGET/4.9.x/ # 确认存在crtbegin.o等文件 find $NDK -name libmpp.so # 确认MPP库路径正确 ``` 5. **环境变量补充建议**: ```bash export C_INCLUDE_PATH="$MPP_ROOT/include:$NDK/sysroot/usr/include" export LIBRARY_PATH="$MPP_ROOT/lib:$NDK/sysroot/usr/lib" ``` 6. **关键路径示意图**: ``` NDK_ROOT ├── toolchains │ └── llvm │ └── prebuilt │ └── linux-x86_64 │ ├── bin # 编译(clang) │ └── sysroot # 系统库和头文件 └── platforms └── android-21 └── arch-arm64 └── usr/lib # crt*.o位置 ``` 建议执行`make distclean`后重新配置,重点关注目标API级别与库路径的对应关系。如果问题持续,可添加`-v`参数查看详细的编译/链接路径。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值