下载
EN
注册

编译运行应用样例报错,提示找不到头文件或库文件

问题现象

获取昇腾samples仓的样例代码(以图片分类应用为例):

  • 编译源码时,提示找不到头文件acl.h,报错片段举例如下:
     fatal error: acl/acl.h: No such file or directory
     #include "acl/acl.h"
              ^~~~~~~~~~~
    compilation terminated.
    CMakeFiles/main.dir/build.make:62: recipe for target 'CMakeFiles/main.dir/main.cpp.o' failed
    make[2]: *** [CMakeFiles/main.dir/main.cpp.o] Error 1
    CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/main.dir/all' failed
    make[1]: *** [CMakeFiles/main.dir/all] Error 2
    Makefile:129: recipe for target 'all' failed
  • 编译源码时,提示找不到库文件libascendcl.so(报错中的-lascendcl,-l表示查找库文件,ascendcl前后分别加上lib和.so组成库文件的名称libascendcl.so),报错片段举例如下:
    /usr/bin/ld: cannot find -lascendcl
    collect2: error: ld returned 1 exit status
    CMakeFiles/main.dir/build.make:94: recipe for target '/home/HwHiAiUser/sample/resnet50_firstapp/out/main' failed
    make[2]: *** [/home/HwHiAiUser/sample/resnet50_firstapp/out/main] Error 1
    CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/main.dir/all' failed
    make[1]: *** [CMakeFiles/main.dir/all] Error 2
    Makefile:129: recipe for target 'all' failed

原因分析

编译应用源码依赖定义AscendCL接口的头文件和库文件,本样例是通过分别配置{DDK_PATH}、{NPU_HOST_LIB}环境变量来查找头文件、库文件,当前报错提示找不到头文件、库文件,则可能是{DDK_PATH}、{NPU_HOST_LIB}环境变量配置地不正确。

解决方法

  1. 登录编译源码的环境,分别使用如下命令查看{DDK_PATH}、{NPU_HOST_LIB}环境变量的值。
    • 查看{DDK_PATH}环境变量的值:
      echo $DDK_PATH

      回显信息示例如下(若无回显信息,则环境变量未配置,跳转到4配置该环境变量):

      /home/HwHiAiUser/Ascend/ascend-toolkit/latest
    • 查看{NPU_HOST_LIB}环境变量的值:
      echo $NPU_HOST_LIB

      回显信息示例如下(若无回显信息,则环境变量未配置,跳转到4配置该环境变量):

      /home/HwHiAiUser/Ascend/ascend-toolkit/latest/runtime/lib64/stub
  2. 根据1中获取到的{DDK_PATH}环境变量值,检查对应路径下是否存在头文件。

    样例中的编译脚本会根据“{DDK_PATH}环境变量值/runtime/include/acl”目录查找编译依赖的头文件,因此可先检查“{DDK_PATH}环境变量值/runtime/include/acl”路径是否存在,若存在,则检查该路径下的acl.h头文件是否存在;若路径或头文件有一个不存在,则需要重新配置{DDK_PATH}环境变量,跳转到4

    • 检查路径是否存在,命令示例如下:
      cd /home/HwHiAiUser/Ascend/ascend-toolkit/latest/runtime/include/acl
    • 检查acl.h是否存在,命令示例如下:
      ll acl.h
  3. 根据1中获取到的{NPU_HOST_LIB}环境变量值,检查对应路径下是否存在库文件。

    样例中的编译脚本会根据{NPU_HOST_LIB}环境变量指向的路径查找编译依赖的库文件,因此可先检查{NPU_HOST_LIB}环境变量指向的路径是否存在,若存在,则检查该路径下的libascendcl.so库文件是否存在;若路径或库文件有一个不存在,则需要重新配置{NPU_HOST_LIB}环境变量,跳转到4

    • 检查路径是否存在,命令示例如下:
      cd /home/HwHiAiUser/Ascend/ascend-toolkit/latest/runtime/lib64/stub
    • 检查libascendcl.so是否存在,命令示例如下:
      ll libascendcl.so
  4. 配置环境变量。

    编译脚本会根据“{DDK_PATH}环境变量值/runtime/include/acl”目录查找编译依赖的头文件,根据{NPU_HOST_LIB}环境变量指向的目录查找编译依赖的库文件。“$HOME/Ascend”请替换“Ascend-cann-toolkit”包的实际安装路径。

    • 当开发环境与运行环境的操作系统架构相同时,配置示例如下所示:
      export DDK_PATH=$HOME/Ascend/ascend-toolkit/latest
      export NPU_HOST_LIB=$DDK_PATH/runtime/lib64/stub
    • 当开发环境与运行环境的操作系统架构不同时,配置示例如下所示:

      例如,当开发环境为X86架构、运行环境为AArch64架构时,则涉及交叉编译,需在开发环境上安装AArch64架构的软件包,将{DDK_PATH}环境变量的路径指向AArch64架构的软件包安装目录(如下所示),便于使用与运行环境架构相同的软件包中的头文件和库文件来编译代码。

      export DDK_PATH=$HOME/Ascend/ascend-toolkit/latest/arm64-linux
      export NPU_HOST_LIB=$DDK_PATH/runtime/lib64/stub
    • 您可以登录对应的环境,执行uname -a命令查询其操作系统的架构。
    • 如果不清楚软件包(包名为Ascend-cann-toolkit_{version}_linux-{arch}.run)的安装路径,也可以使用find -name "filename"命令,查找acl.h、libascendcl.so文件所在的路径,再配置环境变量。

      当环境上安装多个软件版本时,请根据实际情况选择版本,其中,latest目录默认指向最后安装的软件版本。

      当同一个版本下有多个acl.h、libascendcl.so文件时,是由于兼容旧版本的原因,其中部分文件是软链接,方便用户在旧版本下编译应用源码。