/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"
时间: 2025-06-22 14:28:58 浏览: 29
<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`参数查看详细的编译/链接路径。
阅读全文
相关推荐



















