最近这几天在处理集群软件的过程中,遇到各种各样的库和环境变量的问题,被虐的不清!趁此机会,整理了一下 Linux 下静态库、动态库(共享库)和环境变量的一些知识,与大家共享一下。

库的种类

Linux 下的库有两种:静态库动态库(共享库)。

静态库的代码在编译过程中已经被载入可执行程序,因此生成的可执行程序体积较大。静态用 .a 为后缀, 例如: libhello.a

动态库(共享库)的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此生成的可执行程序代码体积较小。动态库通常用 .so 为后缀, 例如: libhello.so

为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如: libhello.so.1.0 ,由于程序连接默认以 .so 为文件后缀名。所以为了使用这些库,通常使用建立符号连接的方式。

库的环境变量

LIBRARY_PATH 环境变量:指定程序静态链接库文件搜索路径。
LD_LIBRARY_PATH 环境变量:指定程序动态链接库文件搜索路径。

库的搜索顺序

动态库链接时搜索路径的顺序:

  1. 编译目标代码时指定的动态库搜索路径;
  2. 环境变量 LD_LIBRARY_PATH 指定动态库搜索路径,它指定程序动态链接库文件搜索路径;
  3. 配置文件 /etc/ld.so.conf 中指定的动态库搜索路径;
  4. 默认的动态库搜索路径 /lib
  5. 默认的动态库搜索路径 /usr/lib

静态库链接时搜索路径的顺序:

  1. ld 会去找 gcc / g++ 命令中的参数 -L
  2. 再找 gcc 的环境变量 LIBRARY_PATH,它指定程序静态链接库文件搜索路径;
  3. 再找默认库目录 /lib/usr/lib/usr/local/lib ,这是当初 compile gcc 时写在程序内的。

环境变量文件加载顺序

正常登录配置文件顺序加载过程,所谓正常登录指用户通过输入用户名和密码登录的状态。
image.png
在 CentOS 7,我们测试一下:

  1. # /etc/profile
  2. $ sudo sed -i '1 iecho "/etc/profile goes start"\n' /etc/profile;head -n 3 /etc/profile
  3. echo "/etc/profile goes start"
  4. # /etc/bashrc
  5. $ sudo sed -i '1 iecho "/etc/bashrc goes start"\n' /etc/bashrc;head -n 3 /etc/bashrc
  6. echo "/etc/bashrc goes start"
  7. # .bash_profile
  8. $ sed -i '1 iecho "~/.bash_profile goes start"\n' ~/.bash_profile;head -n 3 ~/.bash_profile
  9. echo "~/.bash_profile goes start"
  10. # .bashrc
  11. $ sed -i '1 iecho "~/.bashrc goes start"\n' ~/.bashrc;head -n 3 ~/.bashrc
  12. echo "~/.bashrc goes start"
  13. $ sudo echo "echo '/etc/profile.d/test.sh goes'" >/etc/profile.d/test.sh;cat /etc/profile.d/test.sh
  14. echo '/etc/profile.d/test.sh goes'
  15. $ sudo sed -i '1 iecho "/etc/profile goes start"\n' /etc/profile;head -n 3 /etc/profile
  16. echo "/etc/profile goes start"

重新登录终端,可以看到各个环境变量文件的启动顺序:
image.png

当我们不正常启动(su 命令切换用户),环境变量文件加载顺序如下:
image.png
image.png

常用环境变量

我们可以使用 env 命令查看当前用户的所有环境变量设置:

  1. $ env
  2. MANPATH=/usr/local/software/texlive/2018/texmf-dist/doc/man:/usr/local/auto-devops/ansible/docs/man:
  3. XDG_SESSION_ID=61
  4. HOSTNAME=ecs-steven
  5. TERM=xterm
  6. SHELL=/bin/bash
  7. HISTSIZE=3000
  8. ......
  9. LESSOPEN=||/usr/bin/lesspipe.sh %s
  10. INFOPATH=/usr/local/software/texlive/2018/texmf-dist/doc/info:
  11. XDG_RUNTIME_DIR=/run/user/1000
  12. DISPLAY=localhost:16.0
  13. HISTTIMEFORMAT=%F %T
  14. _=/usr/bin/env

用户环境变量常用设置方法

系统级别设置

  • /etc/profile:

全局的系统环境变量设置。适用于多个 shell,比如 bash, sh, zsh 之类。

  • /etc/bashrc:

bash shell 全局环境变量。

用户级别设置

  • ~/.bashrc:

包含专用于当前用户 bash shell 的 bash 信息,当登录时以及每次打开新的 shell 时,该文件被读取。每开一个 shell,这个文件会读取一次。

  • ~/.bash_profile:

每个用户都可使用该文件输入专用于自己使用的 shell 信息,当用户使用 login shell 模式登陆时,该文件仅仅执行一次。

用户临时(当前 shell 对话框)环境变量设置

export 命令:用于/bin/bash shell类型

用户级别 .bashrc 示例

  1. # User Specific Alias
  2. alias ll='ls -lht'
  3. alias le='less -S'
  4. # Custom History setting
  5. HISTFILESIZE=3000000
  6. HISTSIZE=3000
  7. export HISTTIMEFORMAT='%F %T '
  8. HISTCONTROL=ignoredups
  9. PROMPT_COMMAND="history -a“
  10. # Login Style
  11. PS1='\033[35;1m\u@\h \[\e[m\]\t \[\033[36;1m\]$(pwd) \n$ \[\e[m\]'
  12. clear;
  13. # Shortcut Commands
  14. bcl_fq='/Bioinfo/Project/BCL_fastq‘
  15. # Custom Path
  16. ANACONDA2_PATH='/Bioinfo/Pipeline/SoftWare/Anaconda2/bin'
  17. PERL_PATH='/Bioinfo/Pipeline/SoftWare/Perl-5.26/bin‘
  18. export PATH="$ANACONDA2_PATH:$ANACONDA3_PATH:$hdf5_PATH:$PERL_PATH:$PATH"
  19. export LD_LIBRARY_PATH="……: $LD_LIBRARY_PATH"
  20. export PYTHONPATH="……: $PYTHONPATH"