前言:训练营提供的镜像已经帮开发者设置好了开发环境,运行sample仓代码,一般不会遇到编译运行的问题,但我们进行实际应用开发时,还是会碰到诸如:找不到头文件、链接不到动态库等错误。遇到这种情况,不用着急,这些基本上都是和环境变量配置有关。解决这类问题,分三步走:1)确定报错文件的实际路径;2)查看CMakefiles.txt里关于头文件、库文件的路径设置;3)确认环境变量,如有必要修改环境变量。本文将结合sample仓的实例展开描述。写这篇笔记,是因为训练营的小伙伴在实际使用中出现了这个问题,然后和两位小伙伴一起讨论并解决了问题,很感谢训练营给开发者提供了一个共同交流和提高的平台,也感谢一起讨论的两位小伙伴!

        针对编译找不到头文件和库文件,昇腾官方文档对此有专门的描述:

文档首页>CANN社区版>6.3.RC1.alpha002>推理应用开发>应用开发(C&C++)>FAQ>编译运行应用样例报错,提示找不到头文件或库文件

https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/63RC1alpha002/infacldevg/aclcppdevg/aclcppdevg_000203.html

greenhills 编译 greenhills编译无法打开头文件_环境变量


        这种通常是由于环境变量没有设置或者是设置不正确导致的。遇到这样的问题,我们应该怎样去解决,以及背后的原理是什么呢?

        下面,以华为昇腾官方sample仓“https://gitee.com/ascend/samples”中的例程为例,进行说明如何定位解决编译中出现的问题。

一、问题重现及解决方法

        具体选用的工程:

\samples\cplusplus\level2_simple_inference\1_classification\resnet50_imagenet_classification

        浏览ReadMe发现,发现进行工程编译、运行前,需要进行DDK_PATH和NPU_HOST_LIB这两个环境变量的设置。

greenhills 编译 greenhills编译无法打开头文件_深度学习_02


一)帮编译器找到“acl.h”

    那看一下,不设置环境变量会发生什么呢?是的,会报错,找不到alc.h这个头文件。

greenhills 编译 greenhills编译无法打开头文件_深度学习_03

        1、设置DDK_PATH环境变量

        我们把环境变量DDK_PATH这个环境变量设置好,看看会怎样?

greenhills 编译 greenhills编译无法打开头文件_深度学习_04

        2、重新执行CMAKE和Make编译

greenhills 编译 greenhills编译无法打开头文件_深度学习_05

 
        此时,找不到“acl.h”的问题已经不报了,说明找不到头文件的错误已经解决了。报的是找不到库文件lascendcl,显然这是和另一个环境变量有关了。

        下面,继续解决下一个问题,链接时找不到库的错误。

二)帮编译器找到“lascendcl”库

        1、设置环境变量NPU_HOST_LIB

greenhills 编译 greenhills编译无法打开头文件_头文件_06


        2、重新执行CMAKE和Make编译

greenhills 编译 greenhills编译无法打开头文件_greenhills 编译_07

        编译成功,大功告成!        

二、技术分析

        解决这类问题,通常分三步走:1)确定报错文件的实际路径;2)查看CMakefiles.txt里关于头文件、库文件的路径设置;3)确认环境变量,如有必要修改环境变量。下面,就按这三个不走,做一个技术分析。

一)确定报错文件的实际路径

        本例中找不到的文件都是属于CANN的,因此我们还需要了解CANN的tool-kit的安装路径和目录结构:

        1、CANN的安装路径:通常情况下,在安装时不指定的安装路径的情况下,路径如下:

greenhills 编译 greenhills编译无法打开头文件_人工智能_08

        训练营镜像的安装用户是HwHiAiUser,CANN的安装路径是:

/home/HwHiAiUser/Ascend/ascend-toolkit

        具体安装参考用户手册的“安装开发环境”章节内容。

        2、训练营镜像,CANN头文件的路径是:/home/HwHiAiUser/Ascend/ascend-toolkit/latest/include

greenhills 编译 greenhills编译无法打开头文件_人工智能_09


        3、训练营镜像,CANN库文件的路径是:/home/HwHiAiUser/Ascend/ascend-toolkit/latest/runtime/lib64/stub

greenhills 编译 greenhills编译无法打开头文件_深度学习_10

         4、如果我们不熟悉CANN的目录结构,还可以使用find +文件名的方式,查找文件的实际路径。

greenhills 编译 greenhills编译无法打开头文件_深度学习_11


二)查看CMakefiles.txt里关于头文件、库文件的路径设置

        我们来看一下,为什么头文件、链接库的路径是怎么和这两个环境变量关联上的。当我们打开“CMakeLists.txt”文件,会看见下图的字样。这样就将“头文件”、“链接库”的路径设置成上述两个环境变量的值。

greenhills 编译 greenhills编译无法打开头文件_greenhills 编译_12


        CMakefiles.txt是用来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件。设置好环境变量后,需要重新运行一次CMAKE,重新生成makefile文件,将正确的头文件和库文件的路径包含进去。  

三)检查环境变量,如有必要修改环境变量

        1、用echo 检查环境变量

        这个步骤主要会用到Linux的echo $环境变量名,来检查环境变量的值。这里需要特别注意的是,经常会由于由于粗心,把路径敲错了,比如:路径里多一个“/”,少一个“/”啥的。为了万无一失,将路径拷贝下来,然后通过cd 命令,进入目录,确认路径是否正确。

        2、设置环境变量的两种方法        

        我们可以使用export命令,临时设置环境变量,具体方法见上文的实际操作。这种方法在退出终端后,环境变量会失效。

        也可以将export设置环境变量的指令,写到~/.bashrc里,这样用户登录时,就自动完成了环境变量的设置。

greenhills 编译 greenhills编译无法打开头文件_头文件_13