Linux 下的动态库、静态库与环境变量

最近这几天在处理集群软件的过程中,遇到各种各样的库和环境变量的问题,被虐的不清!趁此机会,整理了一下 Linux 下静态库、动态库(共享库)和环境变量的一些知识,与大家共享一下。
库的种类
Linux 下的库有两种:静态库 和 动态库(共享库)。
静态库的代码在编译过程中已经被载入可执行程序,因此生成的可执行程序体积较大。静态用 .a 为后缀, 例如:libhello.a 。
动态库(共享库)的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此生成的可执行程序代码体积较小。动态库通常用 .so 为后缀, 例如:libhello.so 。
为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如:libhello.so.1.0 ,由于程序连接默认以 .so 为文件后缀名。所以为了使用这些库,通常使用建立符号连接的方式。
库的环境变量
LIBRARY_PATH 环境变量:指定程序静态链接库文件搜索路径。
LD_LIBRARY_PATH 环境变量:指定程序动态链接库文件搜索路径。
库的搜索顺序
动态库链接时搜索路径的顺序:
编译目标代码时指定的动态库搜索路径;
环境变量 LD_LIBRARY_PATH 指定动态库搜索路径,它指定程序动态链接库文件搜索路径;
配置文件 /etc/ld.so.conf 中指定的动态库搜索路径;
默认的动态库搜索路径 /lib;
默认的动态库搜索路径 /usr/lib。
静态库链接时搜索路径的顺序:
ld 会去找
gcc/g++命令中的参数-L;再找 gcc 的环境变量 LIBRARY_PATH,它指定程序静态链接库文件搜索路径;
再找默认库目录
/lib,/usr/lib,/usr/local/lib,这是当初 compile gcc 时写在程序内的。
环境变量文件加载顺序
正常登录配置文件顺序加载过程,所谓正常登录指用户通过输入用户名和密码登录的状态。
在 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'
重新登录终端,可以看到各个环境变量文件的启动顺序:
OS
正常登陆,
配置文件加载结果
当我们不正常启动(su 命令切换用户),环境变量文件加载顺序如下:
OS 使用 su 切换用户
登陆,
配置文件加载
顺序
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/bashrc:bash 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 下的动态库、静态库与环境变量的更多相关文章
- Linux下编译、使用静态库和动态库 自己测过的
每个程序实质上都会链接到一个或者多个的库.比如使用C函数的程序会链接到C运行时库,GUI程序会链接到窗口库等等.无论哪种情况,你都会要决定是链接到静态库(static libary)还是动态库(dyn ...
- Linux下制作和使用静态库和动态库
概述 Linux操作系统支持的函数库分为静态库和动态库,动态库又称共享库.linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib. 静态函数库: 这类库的名字一般是libxxx. ...
- linux下 GCC编译链接静态库&动态库
静态库 有时候需要把一组代码编译成一个库,这个库在很多项目中都要用到,例如libc就是这样一个库, 我们在不同的程序中都会用到libc中的库函数(例如printf),也会用到libc中的变量(例如以后 ...
- Linux下查看进程(程序)启动时的环境变量
背景: 因最近试安装Linux下的jira,有一个中文插件安装后,一旦设置开机启动后,它是英文,而在终端再重新启动一次后呢,似乎插件生效,它又恢复为正常中文界面,我首先想这这涉及到一个环境变量的问题, ...
- Linux下安装java的jdk和配置环境变量
每次感觉配这个超级简单 但是每次都要查下 记一下好了 Linux下安装jdk,步骤如下 1:下载jdk包:本章使用的为后缀为tar.gz的文件(不需要安装),如jdk-8u111-linux-x64. ...
- Linux下的Shell编程(2)环境变量和局部变量
Shell Script是一种弱类型语言,使用变量的时候无需首先声明其类型. 局部变量在本地数据区分配内存进行存储,这个变量归当前的Shell所有,任何子进 程都不能访问本地变量.这些变量与环境变量不 ...
- linux下C++动态链接C++库示例详解
注意其中使用函数返回基类指针的用法,因为Linux的动态链接库不能像MFC中那样直接导出类 一.介绍 如何使用dlopen API动态地加载C++函数和类,是Unix C++程序员经常碰到的问题. 事 ...
- 基于s5pv210嵌入式linux使用其他动态、静态库文件程序的交叉编译
刚刚移植了sqlite3迫切想测试一些,结果将原来在ubuntu系统下写好且测试通过的程序,重新编译就报错,无法找到已定义的函数 这是由于没有使用库或者使用了错误的就.库造成的结果. 正确做法为: a ...
- Linux下将多个静态库(.a)合并成一个静态库文件(.a)的命令操作,方法一
.a 文件的结构和.tar文件就没有什么区别. x 命令解出来, a 命令添加, t命令列表 假设A.a, B.a C.a 在/usr/local/lib目录下 mkdir /tmp/libABC c ...
- c/c++:动态库 静态库 linux/windows 例子 (转)
作者:吴秦出处:http://www.cnblogs.com/skynet/本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名吴秦(包含链接). C++静 ...
随机推荐
- 使用 baget 搭建 nuget 私有服务
现在几乎所有语言都提供包管理工具,比如 JavaScript 的 npm ,Java 的 Maven ,Dart 的 pub ..Net 程序当然是 NuGet .NuGet 也出现很多年了,奇怪的是 ...
- Windows系统下Dos命令记录
# 切换到F:\test\目录 /d 参数可以直接切换,不需要先切换盘符 cd /d F:\test\ # 创建文件夹test md tset # 删除文件夹test rd test # 创建文件te ...
- JMM内存模型
● 说说JVM的主要组成部分以及作用? 类加载器.运行时数据区.执行引擎.本地库接口 类加载器子系统 它主要功能是处理类的动态加载,还有链接,并且在第一次引用类时进行初始化. Loading - 加载 ...
- 电商AARRR模型分析(二)—R语言
AARRR模型可以说是用户运营和业务增长非常重要的模型.模型以用户的生命周期为核心,把增长步骤拆分为5个步骤,分别是:获取用户(Acquisition).用户激活(Activiation).用户留存( ...
- [GIT] 如何处理GIT分支合并(GIT MERGE)
1 概述 2 分支合并 如果你有两个分支main和dev,main存放稳定版本,dev是开发版本,一个阶段后,你需要把dev代码更新到main分支中. dev --(merge update cont ...
- Android Studio 样式和主题背景
样式和主题背景 转载自 Styles and Themes | Android Developers 借助 Android 中的样式和主题背景,您可以将应用设计的细节与界面的结构和行为分开,其 ...
- 学会提示-AI时代职场必修课
作者:京东 何雨航 " 上个时代要学会提问,这个时代要学会提示." 引言 当你在写提数代码时,小张已经完成了数据分析:当你正在整理材料时,小王却在和对象逛环球影城:述职时,你发现小 ...
- count(*) count(1) count(字段)效率问题
COUNT(字段名)和COUNT(*)的查询结果有什么不同? COUNT(1)和COUNT(*)之间的效率哪个更高? 你知道答案吗?很多人都认为COUNT(1)比COUNT(*)效率高,真的是这样吗? ...
- C# 从0到实战 命名空间
什么是命名空间 命名空间是C#为了解决类名冲突而产生的一种方案,通过特定的前缀来标识一个类,使得编程者可以在自己的命名空间中自由使用各种类名,这很类似于Java中的包. 一般新手学习C#都会使用一个 ...
- Python tkinter 进度条代码
1 import tkinter as tk 2 import time 3 4 # 创建主窗口 5 window = tk.Tk() 6 window.title('进度条') 7 window.g ...