Linux 环境变量的修改与 C/C++ 头文件搜索路径和库目录的包含方法

Linux下修改环境变量的几种方式

通过profile和bashrc文件修改

所有用户生效的修改方式(/etc下)
  • 修改/etc/profile文件(所有用户登录时执行):
    为每个用户设置环境信息。当用户登录时,该文件被执行一次。
    文件中添加:PATH="$PATH:新的路径",$PATH表示原有路径,路径间用冒号隔开,故有此写法。
  • 修改/etc/bashrc文件(打开shell时生效):
    当 bash shell 被打开时,该文件被读取。
    bashrc可能后缀不一样,注意查看。
对当前用户生效的修改方式(~/下)
  • 修改~/.profile文件(当前用户登录时执行):

1、 ~表示当前用户。
2、无名称只有后缀文件被隐藏,得用ls -a显示。
3、同前,只对单个用户生效,当用户登录时该文件仅执行一次。
4、 在不同的LINUX操作系统下,这个文件可能是不同的,可能是~/.bash_profile, ~/.bash_login 或~/.profile 其中的一种或几种。

  • 修改~/.bashrc文件(当前用户打开shell时执行):

同前,~/.bashrc: 只对单个用户生效,当登录以及每次打开新的 shell 时,该文件被读取。
注1: 在 LINUX 下 HOME 是表示 ~这个变量的。
注2:在不同的 LINUX 操作系统下,这个文件可能是不同的,可能是~/.bash_profile~/.bash_login~/.profile其中的一种或几种,如果存在几种的话,那么执行的优先级就是按列出的顺序。比如 Ubuntu, 用户文件夹下默认的就只有~/.profile文件。在我们的集群上,因为没有 root 权限,一般能改的也只有~/.bashrc文件。

通过environment文件修改

修改 /etc/environment 这个文件也能实现环境变量的设置。
/etc/environment 设置的也是全局变量,从文件本身的作用上来说, /etc/environment 设置的是整个系统的环境,而/etc/profile是设置所有用户的环境。

一般来说,/etc/environment 中不能包含命令,即直接通过 VAR="…" 的方式设置,不使用 export 。
需注销/重启之后,才能对每个新终端窗口都生效。
使用 source /etc/environment 可以使变量设置在当前窗口立即生效。

终端exprot命令临时修改

在终端,直接使用export PATH=$PATH:/usr/local/hadoop/bin

使用 export 设置的变量,只对当前终端 Shell 有效,也就是说如果新打开一个终端,那这个 export设置的变量在新终端中使无法读取到的。适合设置一些临时变量。
export后面的变量值不加引号。

其他tips:

1、使用形如source ~/.profile的命令可以使文件立即生效,这对于刚改完文件,还没重启系统或者重启终端时使用较多。
2、 echo $PATH召唤当前路径。
3、可以修改bash、profile甚至environment的方式修改变量,看起来etc是整个系统下所有用户用的文件夹,~是表示用户名下的当前目录。
4、PATH变量是一个字符串,$PATH当前值,用冒号拼接不同的路径。

上文简单总结

1、写得比较琐碎,如果你不想记太多或者也不想查的话,只要记住,如无特殊需求,一般修改/etc/profile这个文件就可以了。简单解释就是,一般用的就是自己的 PC 机,也就一个主账户,可以多给点权限,没必要基于单用户修改~目录下的对应文件;如果用的是公共机器,那么你会想到 /etc 你可能没有权限,你自然而然会想到 $HOME 你有权限的目录,更不需要记;通过environment 文件修改,并不是主流,且其修改后新建 shell 终端对修改有效需要重启机器,这时候,如果是 profile,可能 source 完之后,新建的终端就有效了,即时测试,非常方便;为什么不用 bashrc 文件呢?因为 profile 权限更高。当 bash shell 被打开时, bashrc 文件才被读取。对于一些非 Linux 的 Unix 系统,它的 shell 可能就不是 bash shell。

2、 profile 文件是系统首次登录时过一遍,而 bashrc 文件是每次打开一个终端的时候执行,对于桌面版的系统,必要的时候,还是需要重启系统的。鉴于此,如果你使用的是桌面版的系统,就要注意你运行的进程是否是通过中终端进入了。本质上,以上的命令都是基于终端的,必要的时候还是需要重启。举个简单的例子,假如你在 codeblocks 上写了一段代码,现在需要在 profile 中把相关的头文件目录 include 进来,那么,修改完之后,source 是不够的,你需要重启机器。

3、执行顺序为:/etc/profile -> ~/.bash_profile |~/.bash_login | ~/.profile)-> ~/.bashrc->/etc/bashrc ->~/.bash_logout。一般理解为,基于登录执行的,优先于基于打开终端执行的,针对于所有用户的,优先于个人用户。那么在 HOME 下的 bashrc 优先于 etc 下的怎么理解呢?这是因为在 HOME 下的文件里面书写了去执行 etc 下的。其中的 | 表示只执行其中的一个,如果有多个,按顺序所表示的优先级执行一个,logout 所表示的 bash 文件,是在系统登出的时候执行的,相对于 login。

4、对于 bashrc,如果你已经打开一个 terminal,然后你修改了这个文件,并且 source,那么在这个 terminal 下是不会生效的。因为,它只对新的 terminal 生效。

5、修改一些重要环境变量的方式形如:export XXXX=$XXXX:YYYY。这里的 XXXX 可以是 PATH、C_INCLUDE_PATH、CPLUS_INCLUDE_PATH、LD_LIBRARY_PATH、LIBRARY_PATH 等, YYYY 表示你要添加的路径,注意,中间使用冒号隔开的。

头文件搜索路径(包含目录)和库目录的包含方式与库文件的链接方法

程序搜索路径一览:

PATH:可执行文件;
C_INCLUDE_PATH:C头文件;CPLUS_INCLUDE_PATH:C++头文件;
LD_LIBRARY_PATH:动态链接库;LIBRARY_PATH:静态库。

也可以在程序编译过程中,指定搜索路径,使用 -I 指定头文件搜索路径,使用 -L 指定库文件搜索路径。这里假定动态链接库名为 libfoo.so,静态链接库名称为libfoo.a。动静态链接库的命名规则为 libxxx.so 和 libxxx.a 。链接的写法如下:

 gcc main.c -I/home/usr/local/include  
 gcc main.c -L/etc/lib -lfoo
 gcc main.c -L/home/usr/local/lib -static -lfoo 

-I :指定头文件路径
-i :指定头文件名字 (一般不用,c/cpp 文件里面会 include ,完全没必要)
-L:指定连接的动态库或者静态库路径
-l (L的小写):指定需要链接的库的名字

对于一个 C/C++ 程序来说,头文件一般存放一些函数的声明等,CPP 和 C 文件用来写函数的实现,可以封装为库文件,而在工程的入口,头文件和库文件的搜索路径以及具体到包含哪一个都是要有的。路径的声明:可以用环境变量;可以在编译的时候使用大写的 I 和 L 声明。具体文件的包含:INCLUDE 文件在 C/CPP 文件中使用头文件的方式写入(include <xxx.h>);库文件在(编译)链接的时候使用小写字母 l (小写的L)链接进去(-lxxx)。
需要声明的是,因库的命名规则,链接库采用简写,如链接 libc.a 写成 -lc,链接 libc.so 也写成 -lc 。如果两种库都有,动态库优先,链接静态库就需要 -static 标识,或者写全称。这里 -i 不用是因为,我们再 cpp 或者 c 文件里面已经 include 对应的头文件了。而对于动态链接库和静态库,就一定要写清楚链接的具体是哪个库,程序之间库的调用关系,要搞清楚,故而有小写 L,即 l。

供复制修改的演示写法如下:

export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/include/libxml2:/home/test/Desktop/boost_1_75_0
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/test/Desktop/boost_1_75_0/stage/lib  
export LIBRARY_PATH=$LIBRARY_PATH:/home/test/Desktop/boost_1_75_0/stage/lib  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陆嵩

有打赏才有动力,你懂的。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值