./configure: 5993: /opt/android-ndk-r18b/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-nm: not found ERROR: libdrm not found using pkg-config 我只有llvm-nm,这是命令:./configure --target-os=android --arch=aarch64 --enable-cross-compile --cross-prefix=$TOOLCHAIN/bin/$TARGET$API- --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
时间: 2025-06-22 14:29:13 浏览: 16
<think>好的,我现在遇到了一个编译配置的问题,需要仔细分析一下。用户提供的错误信息有两个主要部分:首先是找不到`aarch64-linux-android21-nm`,然后是`libdrm`通过pkg-config未被发现。让我一步步来思考可能的原因和解决办法。
首先,关于`./configure: 5993: .../aarch64-linux-android21-nm: not found`这个错误。这里的`nm`命令是GNU的二进制工具,用于显示目标文件的符号表。用户提到他们只有`llvm-nm`,可能他们的工具链是基于LLVM的,而传统的GNU工具可能缺失或者路径配置不正确。在Android NDK中,尤其是r18之后的版本,Google已经转向使用LLVM的工具链,而不是GNU的。因此,可能需要调整configure脚本,使其指向正确的`llvm-nm`而不是默认的`aarch64-linux-android21-nm`。
其次,`ERROR: libdrm not found using pkg-config`说明配置过程中无法找到libdrm库。这通常是因为pkg-config没有正确的路径指向libdrm的.pc文件,或者libdrm本身未正确安装或编译。用户需要确保libdrm已经正确安装在他们的系统中,并且PKG_CONFIG_PATH环境变量包含了libdrm.pc所在的目录。
接下来看用户提供的configure参数。注意到他们使用了`--cross-prefix=$TOOLCHAIN/bin/$TARGET$API-`,这里可能存在变量替换的问题。例如,如果`$TARGET$API`没有被正确展开,可能导致路径错误。比如,可能应该是`aarch64-linux-android21-`,但如果`$TARGET`是`aarch64-linux-android`而`$API`是`21`,那么组合起来可能变成`aarch64-linux-android21`,但实际的工具链中的工具可能是`aarch64-linux-android21-clang`这样的格式。但这里的问题是关于`nm`的,所以可能需要检查`cross-prefix`是否正确设置,或者是否需要手动指定`nm`的路径。
此外,用户提到他们只有`llvm-nm`,所以可能需要将`nm`指定为llvm-nm的路径。在configure的时候,是否有一个选项可以覆盖默认的nm路径?例如,通过`--nm=llvm-nm`或者类似的参数。或者,可能需要将工具链的路径添加到PATH环境变量中,让configure自动找到llvm-nm。
另外,检查NDK的目录结构。在NDK r18b中,工具链的路径通常是`toolchains/llvm/prebuilt/linux-x86_64/bin/`,里面应该包含各种工具,比如`aarch64-linux-android21-clang`,`llvm-nm`可能是一个符号链接或者实际文件。如果用户的环境变量TOOLCHAIN指向了正确的路径,那么`$TOOLCHAIN/bin/`应该包含这些工具。但错误提示中的路径是`/opt/android-ndk-r18b/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-nm`,而该文件不存在,说明configure脚本在寻找这个特定名称的工具,但实际可能不存在,因为LLVM的工具可能使用不同的命名方式,比如`llvm-nm`,或者通过不同的前缀。
可能解决方案之一是创建符号链接,将`llvm-nm`链接为`aarch64-linux-android21-nm`。例如,进入工具链的bin目录,执行`ln -s llvm-nm aarch64-linux-android21-nm`。但这种方法可能不够灵活,特别是如果其他工具也存在类似问题的话。
另一种方法是检查configure脚本是否允许指定nm的路径。例如,在configure参数中添加`--nm="$TOOLCHAIN/bin/llvm-nm"`,如果有这个选项的话。或者通过环境变量设置,如`NM=llvm-nm`,这样配置脚本会使用指定的nm命令。
关于libdrm的问题,需要确认libdrm是否已经正确安装到sysroot或者某个目录,并且PKG_CONFIG_PATH指向了正确的.pc文件位置。例如,如果libdrm安装在`$SYSROOT/usr/lib/pkgconfig`,则需要设置`export PKG_CONFIG_PATH=$SYSROOT/usr/lib/pkgconfig:$PKG_CONFIG_PATH`。或者,用户可能在编译libdrm时没有安装到正确的位置,或者没有安装pkg-config文件。
此外,可能需要在configure时添加额外的CFLAGS和LDFLAGS来指定libdrm的头文件和库路径。例如,`--extra-cflags="-I/path/to/libdrm/include"`和`--extra-ldflags="-L/path/to/libdrm/lib"`。但用户已经用了`--extra-cflags="-I$MPP_ROOT/include -fPIC"`,可能需要添加libdrm的路径到这里。
总结可能的步骤:
1. 解决nm找不到的问题:
- 检查工具链路径是否正确,确认是否存在llvm-nm。
- 在configure参数中添加`--nm="$TOOLCHAIN/bin/llvm-nm"`或者设置环境变量`NM=$TOOLCHAIN/bin/llvm-nm`。
- 或者创建符号链接,让configure能找到需要的工具名称。
2. 解决libdrm找不到的问题:
- 确认libdrm是否已正确安装,特别是pkg-config文件是否存在。
- 设置PKG_CONFIG_PATH到包含libdrm.pc的目录。
- 如果libdrm是交叉编译的,可能需要指定PKG_CONFIG_SYSROOT_DIR等变量。
- 或者在configure时添加`--extra-cflags`和`--extra-ldflags`来指定路径。
用户可能需要检查他们的环境变量是否正确设置,特别是TOOLCHAIN、MPP_ROOT,以及是否遗漏了libdrm的相关路径。此外,确保使用的NDK版本与配置脚本兼容,可能需要检查是否有已知的补丁或配置调整适用于NDK r18b。</think>### 问题分析:
你遇到的错误主要涉及两部分:
1. **`aarch64-linux-android21-nm` 未找到**:NDK r18b 使用 LLVM 工具链,默认的 `nm` 工具为 `llvm-nm`,但配置脚本尝试调用 GNU 格式命名的 `nm`。
2. **`libdrm` 未通过 pkg-config 找到**:缺少 libdrm 的开发文件或 pkg-config 路径未正确配置。
---
### 解决方案:
#### 1. 解决 `aarch64-linux-android21-nm` 缺失问题
- **方法一:符号链接到 `llvm-nm`**
```bash
cd /opt/android-ndk-r18b/toolchains/llvm/prebuilt/linux-x86_64/bin
ln -s llvm-nm aarch64-linux-android21-nm
```
此操作让脚本找到预期的 `nm` 工具。
- **方法二:直接指定 `nm` 路径**
在 `./configure` 命令中添加参数:
```bash
--nm="$TOOLCHAIN/bin/llvm-nm"
```
- **方法三:检查环境变量**
确保 `TOOLCHAIN` 和 `TARGET` 变量正确指向 NDK 的 LLVM 路径,例如:
```bash
export TOOLCHAIN=/opt/android-ndk-r18b/toolchains/llvm/prebuilt/linux-x86_64
export TARGET=aarch64-linux-android
export API=21
```
---
#### 2. 解决 `libdrm` 未找到问题
- **步骤一:安装或编译 libdrm**
确保已为 Android 交叉编译 libdrm,并将生成的 `.pc` 文件(如 `libdrm.pc`)放置在 `pkgconfig` 目录中。
- **步骤二:设置 `PKG_CONFIG_PATH`**
指定 libdrm 的 pkg-config 路径:
```bash
export PKG_CONFIG_PATH=/path/to/libdrm/pkgconfig:$PKG_CONFIG_PATH
```
若 libdrm 安装在 Android sysroot 中,还需设置:
```bash
export PKG_CONFIG_SYSROOT_DIR=$SYSROOT
```
- **步骤三:添加编译参数**
在 `./configure` 中补充头文件和库路径:
```bash
--extra-cflags="-I/path/to/libdrm/include" \
--extra-ldflags="-L/path/to/libdrm/lib"
```
---
#### 修改后的完整 `./configure` 示例:
```bash
./configure \
--target-os=android \
--arch=aarch64 \
--enable-cross-compile \
--cross-prefix=$TOOLCHAIN/bin/$TARGET$API- \
--cc=$TOOLCHAIN/bin/clang \
--cxx=$TOOLCHAIN/bin/clang++ \
--enable-rkmpp \
--enable-libdrm \
--extra-cflags="-I$MPP_ROOT/include -fPIC -I/path/to/libdrm/include" \
--extra-ldflags="-L/path/to/libdrm/lib" \
--enable-shared \
--enable-version3 \
--disable-static \
--disable-doc \
--nm="$TOOLCHAIN/bin/llvm-nm"
```
---
### 验证步骤:
1. 检查工具链路径是否存在 `llvm-nm`。
2. 运行 `pkg-config --exists libdrm` 确认是否能找到库。
3. 确保所有环境变量(`TOOLCHAIN`, `TARGET`, `API`)在脚本执行时已正确导出。
若问题依旧,建议检查 NDK 版本兼容性及 libdrm 的交叉编译配置。
阅读全文
相关推荐














