怎么让编译环境找到存在的文件--linux环境变量---小白入门知识汇总2

举报
红鱼波波 发表于 2022/04/20 09:09:50 2022/04/20
【摘要】 本文介绍了昇腾研发过程中,关于环境变量的相关知识。

在昇腾样例编译中,经常会碰到找不到xxx文件的情况,如果确定这些工具已经安装,那么大概率和环境变量有关,这篇博客将会讲一下关于环境变量的一些事情 。


所谓环境变量,就是一系列系统预先定义的变量,比如库文件路径,搜索路径等。比如 $PATH变量,规定了计算机搜索可执行文件的目录,我有个可执行文件叫做buildfs_st,放在/home/red_fish/tools/bin下,我只要把/home/red_fish/tools/bin加入环境变量$PATH,则在任何目录下,当我输入buildfs_st,都可以直接执行该可执行文件。当然,如果不加入也可以执行,就需要打全目录/home/red_fish/tools/bin/buildfs_st。这个小技巧在遇到一部分编译问题的时候很有用,比如之前碰到在编译到最后一步ld(链接形成最后文件)的时候,如果报错找不到 xxx文件或者库,我们可以选择三种方式:

1.找到编译配置问题,重新构建编译文件(可能导致工程重新编译,如果编译内容复杂,耗时较高)

2.把这些库和文件都加入到环境变量,重新编译一次(临时措施,可能导致无法迁移到其他设备编译,可能导致工具版本错乱,例如把不同版本的目录也引入了PATH)

3.复制最后一个命令的全部,然后把找不到的文件补成全路径(临时措施,需要每次单独操作一下,麻烦,可能会漏掉一些编译脚本里的信息,导致无法编译,只是一种选择)

  • 操作指令 export

最核心的环境 变量操作命令是

语法

export [-fnp][变量名称]=[变量设置值]

参数说明

  • -f  指示[变量名称]中为函数名称。
  • -n  删除指定的变量。(临时禁用指定变量,本shell有效)
  • -p  列出所有的shell赋予程序的环境变量。

典型环境中的变量如下:

对我们比较关键的是:PATH和LD_LIBRARY_PATH,PATH是可执行文件的位置,比如gcc、cmake等,当报错一个命令找不到的时候,可以输入这个命令的前几个字母,比如gc,然后快速按两下tab

如果能够补全看到,就是已经在环境变量覆盖里了,如果还 报找不到,需要考虑版本问题(比如实际找到的是一个arm可执行文件但是我们平台是x86的),注意不同用户的环境变量是可以不一样的,比如在HwHiAiUser下安装了tools,但是在root下,就有可能找不到,需要再添加一次。

  • 临时添加环境变量

在某些操作中,我不需要环境变量总是生效,这时,我们可以选择临时添加一下路径。

临时添加环境变量的命令也是export 比如我要/home/red_fish/tools/bin下的buildfs_st可以被其他位置直接调用,则可以


export  PATH=$PATH:/home/red_fish/tools/bin

可以看到,这个路径已经加入到PATH中了。

注意,在 修改PATH过程中,语法是PATH=$PATH:“/要增加的路径”

这是要继承原有的路径,否则你直接等于的话,buildfs_st是找到了,其他指令找不到了,你就只能关掉这个shell,重新开一个了。如果添加多个路径,路径间用冒号隔开,如果有空格路径可以用双引号封一下。 


  • 永久添加环境变量

有时候我们需要环境变量一直生效,这时候我们一般会把环境变量 配置指令放在脚本里。如果这个变量希望对所有人生效,一般会放在/etc/profile里,如果这个变量希望只对当前用户生效,则可以放在~/.bashrc中(~可以直接用在命令里,表示当前用户的home目录,对于HwHiAiUser,就是/home/HwHiAiUser,对于root,就是/root或者/home/root)

编辑然后放在文档最后面:

或者放到sh脚本中,然后使用source引入,sh脚本里也是一堆的export


为啥直接输入的时候是export,如果放在可执行文件就要用source?我们来看一下help

source用单条执行命令的方式来执行文件,为啥要这么麻烦呢?因为linux在执行可执行文件的时候,会先fork一个bash的副本,然后在副本中进行执行,当执行完毕后,副本就销毁了。如果你直接执行脚本,脚本里的变量对脚本里的命令是有效的,当脚本执行完,副本销毁,就失效了,所以必须使用source的方式。

在修改完环境变量后,也要用source方式执行一下,才能对于当前窗口生效

source  /etc/profile

source ~/.bashrc

对于新开窗口,会自动执行这两个语句,所以不管就可以了。

如果要查阅指定的环境变量,可以用echo 

  • sudo和su的情况

sudo提升权限,可以让普通用户获得更高权限用户的权限,但是环境变量依旧继承原有用户的shell。使用su切换用户,权限和环境变量都切换为新用户的。




【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。