前言:训练营提供的镜像已经帮开发者设置好了开发环境,运行sample仓代码,一般不会遇到编译运行的问题,但我们进行实际应用开发时,还是会碰到诸如:找不到头文件、链接不到动态库等错误。遇到这种情况,不用着急,这些基本上都是和环境变量配置有关。解决这类问题,分三步走:1)确定报错文件的实际路径;2)查看CMakefiles.txt里关于头文件、库文件的路径设置;3)确认环境变量,如有必要修改环境变量。本文将结合sample仓的实例展开描述。写这篇笔记,是因为训练营的小伙伴在实际使用中出现了这个问题,然后和两位小伙伴一起讨论并解决了问题,很感谢训练营给开发者提供了一个共同交流和提高的平台,也感谢一起讨论的两位小伙伴!
针对编译找不到头文件和库文件,昇腾官方文档对此有专门的描述:
文档首页>CANN社区版>6.3.RC1.alpha002>推理应用开发>应用开发(C&C++)>FAQ>编译运行应用样例报错,提示找不到头文件或库文件
这种通常是由于环境变量没有设置或者是设置不正确导致的。遇到这样的问题,我们应该怎样去解决,以及背后的原理是什么呢?
下面,以华为昇腾官方sample仓“https://gitee.com/ascend/samples”中的例程为例,进行说明如何定位解决编译中出现的问题。
一、问题重现及解决方法
具体选用的工程:
\samples\cplusplus\level2_simple_inference\1_classification\resnet50_imagenet_classification
浏览ReadMe发现,发现进行工程编译、运行前,需要进行DDK_PATH和NPU_HOST_LIB这两个环境变量的设置。
一)帮编译器找到“acl.h”
那看一下,不设置环境变量会发生什么呢?是的,会报错,找不到alc.h这个头文件。
1、设置DDK_PATH环境变量
我们把环境变量DDK_PATH这个环境变量设置好,看看会怎样?
2、重新执行CMAKE和Make编译
此时,找不到“acl.h”的问题已经不报了,说明找不到头文件的错误已经解决了。报的是找不到库文件lascendcl,显然这是和另一个环境变量有关了。
下面,继续解决下一个问题,链接时找不到库的错误。
二)帮编译器找到“lascendcl”库
1、设置环境变量NPU_HOST_LIB
2、重新执行CMAKE和Make编译
编译成功,大功告成!
二、技术分析
解决这类问题,通常分三步走:1)确定报错文件的实际路径;2)查看CMakefiles.txt里关于头文件、库文件的路径设置;3)确认环境变量,如有必要修改环境变量。下面,就按这三个不走,做一个技术分析。
一)确定报错文件的实际路径
本例中找不到的文件都是属于CANN的,因此我们还需要了解CANN的tool-kit的安装路径和目录结构:
1、CANN的安装路径:通常情况下,在安装时不指定的安装路径的情况下,路径如下:
训练营镜像的安装用户是HwHiAiUser,CANN的安装路径是:
/home/HwHiAiUser/Ascend/ascend-toolkit
具体安装参考用户手册的“安装开发环境”章节内容。
2、训练营镜像,CANN头文件的路径是:/home/HwHiAiUser/Ascend/ascend-toolkit/latest/include
3、训练营镜像,CANN库文件的路径是:/home/HwHiAiUser/Ascend/ascend-toolkit/latest/runtime/lib64/stub
4、如果我们不熟悉CANN的目录结构,还可以使用find +文件名的方式,查找文件的实际路径。
二)查看CMakefiles.txt里关于头文件、库文件的路径设置
我们来看一下,为什么头文件、链接库的路径是怎么和这两个环境变量关联上的。当我们打开“CMakeLists.txt”文件,会看见下图的字样。这样就将“头文件”、“链接库”的路径设置成上述两个环境变量的值。
CMakefiles.txt是用来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件。设置好环境变量后,需要重新运行一次CMAKE,重新生成makefile文件,将正确的头文件和库文件的路径包含进去。
三)检查环境变量,如有必要修改环境变量
1、用echo 检查环境变量
这个步骤主要会用到Linux的echo $环境变量名,来检查环境变量的值。这里需要特别注意的是,经常会由于由于粗心,把路径敲错了,比如:路径里多一个“/”,少一个“/”啥的。为了万无一失,将路径拷贝下来,然后通过cd 命令,进入目录,确认路径是否正确。
2、设置环境变量的两种方法
我们可以使用export命令,临时设置环境变量,具体方法见上文的实际操作。这种方法在退出终端后,环境变量会失效。
也可以将export设置环境变量的指令,写到~/.bashrc里,这样用户登录时,就自动完成了环境变量的设置。