最近这几天在处理集群软件的过程中,遇到各种各样的库和环境变量的问题,被虐的不清!趁此机会,整理了一下 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 时写在程序内的。

环境变量文件加载顺序

正常登录配置文件顺序加载过程,所谓正常登录指用户通过输入用户名和密码登录的状态。

CentOS 正常登陆,配置文件加载顺序


在 CentOS 7,我们测试一下:

# /etc/profile
$ sudo sed -i '1 iecho "/etc/profile goes start"\n' /etc/profile;head -n 3 /etc/profile
echo "/etc/profile goes start"

# /etc/bashrc
$ sudo sed -i '1 iecho "/etc/bashrc goes start"\n' /etc/bashrc;head -n 3 /etc/bashrc
echo "/etc/bashrc goes start"

# .bash_profile
$ sed -i '1 iecho "~/.bash_profile goes start"\n' ~/.bash_profile;head -n 3 ~/.bash_profile
echo "~/.bash_profile goes start"

# .bashrc
$ sed -i '1 iecho "~/.bashrc goes start"\n' ~/.bashrc;head -n 3 ~/.bashrc
echo "~/.bashrc goes start"

$ sudo echo "echo '/etc/profile.d/test.sh goes'" >/etc/profile.d/test.sh;cat /etc/profile.d/test.sh
echo '/etc/profile.d/test.sh goes'

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

Cent
OS 
正常登陆,
配置文件加载结果

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

Cent
OS 使用 su 切换用户
登陆,
配置文件加载
顺序

Cent
OS 使用 su 切换用户
登陆,
配置文件加载结果





常用的环境变量

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

$ env
MANPATH=/usr/local/software/texlive/2018/texmf-dist/doc/man:/usr/local/auto-devops/ansible/docs/man:
XDG_SESSION_ID=61
HOSTNAME=ecs-steven
TERM=xterm
SHELL=/bin/bash
HISTSIZE=3000
......
LESSOPEN=||/usr/bin/lesspipe.sh %s
INFOPATH=/usr/local/software/texlive/2018/texmf-dist/doc/info:
XDG_RUNTIME_DIR=/run/user/1000
DISPLAY=localhost:16.0
HISTTIMEFORMAT=%F %T
_=/usr/bin/env

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

系统级别设置

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

  • /etc/bashrcbash shell 全局环境变量。

用户级别设置

  • ~/.bashrc 包含专用于当前用户 bash shell 的 bash 信息,当登录时以及每次打开新的 shell  时,该文件被读取。 每开一个 shell,这个文件会读取一次。
  • ~/.bash_profile 每个用户都可使用该文件输入专用于自己使用的 shell 信息,当用户使用 login  shell 模式登陆时,该文件 仅仅执行一次 。

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

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

bashrc 示例

# User Specific Alias
alias ll='ls -lht'
alias le='less -S'

# Custom History setting
HISTFILESIZE=3000000
HISTSIZE=3000
export HISTTIMEFORMAT='%F %T '
HISTCONTROL=ignoredups
PROMPT_COMMAND="history -a“

# Login Style
PS1='\033[35;1m\u@\h \[\e[m\]\t \[\033[36;1m\]$(pwd) \n$ \[\e[m\]'
clear;

# Shortcut Commands
bcl_fq='/Bioinfo/Project/BCL_fastq‘

# Custom Path
ANACONDA2_PATH='/Bioinfo/Pipeline/SoftWare/Anaconda2/bin'
PERL_PATH='/Bioinfo/Pipeline/SoftWare/Perl-5.26/bin‘
export PATH="$ANACONDA2_PATH:$hdf5_PATH:$PERL_PATH:$PATH"

export LD_LIBRARY_PATH="……: $LD_LIBRARY_PATH"
export PYTHONPATH="……: $PYTHONPATH"

——The  End——

本文分享自微信公众号 - 生信科技爱好者(bioitee)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

Linux 下的动态库、静态库与环境变量的更多相关文章

  1. Linux下编译、使用静态库和动态库 自己测过的

    每个程序实质上都会链接到一个或者多个的库.比如使用C函数的程序会链接到C运行时库,GUI程序会链接到窗口库等等.无论哪种情况,你都会要决定是链接到静态库(static libary)还是动态库(dyn ...

  2. Linux下制作和使用静态库和动态库

    概述 Linux操作系统支持的函数库分为静态库和动态库,动态库又称共享库.linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib. 静态函数库: 这类库的名字一般是libxxx. ...

  3. linux下 GCC编译链接静态库&动态库

    静态库 有时候需要把一组代码编译成一个库,这个库在很多项目中都要用到,例如libc就是这样一个库, 我们在不同的程序中都会用到libc中的库函数(例如printf),也会用到libc中的变量(例如以后 ...

  4. Linux下查看进程(程序)启动时的环境变量

    背景: 因最近试安装Linux下的jira,有一个中文插件安装后,一旦设置开机启动后,它是英文,而在终端再重新启动一次后呢,似乎插件生效,它又恢复为正常中文界面,我首先想这这涉及到一个环境变量的问题, ...

  5. Linux下安装java的jdk和配置环境变量

    每次感觉配这个超级简单 但是每次都要查下 记一下好了 Linux下安装jdk,步骤如下 1:下载jdk包:本章使用的为后缀为tar.gz的文件(不需要安装),如jdk-8u111-linux-x64. ...

  6. Linux下的Shell编程(2)环境变量和局部变量

    Shell Script是一种弱类型语言,使用变量的时候无需首先声明其类型. 局部变量在本地数据区分配内存进行存储,这个变量归当前的Shell所有,任何子进 程都不能访问本地变量.这些变量与环境变量不 ...

  7. linux下C++动态链接C++库示例详解

    注意其中使用函数返回基类指针的用法,因为Linux的动态链接库不能像MFC中那样直接导出类 一.介绍 如何使用dlopen API动态地加载C++函数和类,是Unix C++程序员经常碰到的问题. 事 ...

  8. 基于s5pv210嵌入式linux使用其他动态、静态库文件程序的交叉编译

    刚刚移植了sqlite3迫切想测试一些,结果将原来在ubuntu系统下写好且测试通过的程序,重新编译就报错,无法找到已定义的函数 这是由于没有使用库或者使用了错误的就.库造成的结果. 正确做法为: a ...

  9. Linux下将多个静态库(.a)合并成一个静态库文件(.a)的命令操作,方法一

    .a 文件的结构和.tar文件就没有什么区别. x 命令解出来, a 命令添加, t命令列表 假设A.a, B.a C.a 在/usr/local/lib目录下 mkdir /tmp/libABC c ...

  10. c/c++:动态库 静态库 linux/windows 例子 (转)

    作者:吴秦出处:http://www.cnblogs.com/skynet/本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名吴秦(包含链接). C++静 ...

随机推荐

  1. 使用 baget 搭建 nuget 私有服务

    现在几乎所有语言都提供包管理工具,比如 JavaScript 的 npm ,Java 的 Maven ,Dart 的 pub ..Net 程序当然是 NuGet .NuGet 也出现很多年了,奇怪的是 ...

  2. Windows系统下Dos命令记录

    # 切换到F:\test\目录 /d 参数可以直接切换,不需要先切换盘符 cd /d F:\test\ # 创建文件夹test md tset # 删除文件夹test rd test # 创建文件te ...

  3. JMM内存模型

    ● 说说JVM的主要组成部分以及作用? 类加载器.运行时数据区.执行引擎.本地库接口 类加载器子系统 它主要功能是处理类的动态加载,还有链接,并且在第一次引用类时进行初始化. Loading - 加载 ...

  4. 电商AARRR模型分析(二)—R语言

    AARRR模型可以说是用户运营和业务增长非常重要的模型.模型以用户的生命周期为核心,把增长步骤拆分为5个步骤,分别是:获取用户(Acquisition).用户激活(Activiation).用户留存( ...

  5. [GIT] 如何处理GIT分支合并(GIT MERGE)

    1 概述 2 分支合并 如果你有两个分支main和dev,main存放稳定版本,dev是开发版本,一个阶段后,你需要把dev代码更新到main分支中. dev --(merge update cont ...

  6. Android Studio 样式和主题背景

    样式和主题背景 转载自   Styles and Themes  |  Android Developers 借助 Android 中的样式和主题背景,您可以将应用设计的细节与界面的结构和行为分开,其 ...

  7. 学会提示-AI时代职场必修课

    作者:京东 何雨航 " 上个时代要学会提问,这个时代要学会提示." 引言 当你在写提数代码时,小张已经完成了数据分析:当你正在整理材料时,小王却在和对象逛环球影城:述职时,你发现小 ...

  8. count(*) count(1) count(字段)效率问题

    COUNT(字段名)和COUNT(*)的查询结果有什么不同? COUNT(1)和COUNT(*)之间的效率哪个更高? 你知道答案吗?很多人都认为COUNT(1)比COUNT(*)效率高,真的是这样吗? ...

  9. C# 从0到实战 命名空间

    什么是命名空间 命名空间是C#为了解决类名冲突而产生的一种方案,通过特定的前缀来标识一个类,使得编程者可以在自己的命名空间中自由使用各种类名,这很类似于Java中的包. 一般新手学习C#都会使用一个 ...

  10. Python tkinter 进度条代码

    1 import tkinter as tk 2 import time 3 4 # 创建主窗口 5 window = tk.Tk() 6 window.title('进度条') 7 window.g ...