【2023 · CANN训练营第一季】——编译时找不到头文件,找不到库文件,怎么办???

161 阅读4分钟

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

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

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

www.hiascend.com/document/de…

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

        下面,以华为昇腾官方sample仓“gitee.com/ascend/samp…

一、问题重现及解决方法

        具体选用的工程:

\samples\cplusplus\level2_simple_inference\1_classification\resnet50_imagenet_classification

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

0717559e2ef80694d3bf0dee00b1a52d_cbfdce5fe078f0dac481ef85fe8282499c8255a5.png@942w_213h_progressive.webp

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

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

f60a418deea09426b89962a9ebce047e_3f1c2bc420b35e990ab69a14cbdee2e98047e99e.png@942w_410h_progressive.webp

        1、设置DDK_PATH环境变量

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

image.png

        2、重新执行CMAKE和Make编译

image.png  

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

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

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

        1、设置环境变量NPU_HOST_LIB

image.png

        2、重新执行CMAKE和Make编译

image.png

        编译成功,大功告成!        

二、技术分析

        解决这类问题,通常分三步走: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

601021f4d193e1c6c2cc768e1df26e33_03925983fc576345bc6039c297b712d77c689fdc.png@942w_287h_progressive.webp

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

7905159f6cae743b94250be20c37496c_57ffb4050b661e626160cc27d0d259bdbcf620c6.png@942w_240h_progressive.webp

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

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

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

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

        1、用echo 检查环境变量

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

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

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

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

0838fb5a3b9272e0ee3977ab6e660602_2918e22c9d7378889d4e65b9c8fe671e8caf181e.png@942w_476h_progressive.webp