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++静 ...
随机推荐
- 最大流应用(Maximum Flow Application)
1. 二分图匹配(Bipartite Matching) 1.1 匹配(Matching) Def. Given an undirected graph \(G = (V, E)\), subset ...
- 常用ADB命令使用方法
移动端操作流程 在设置中找到关于手机(或关于平板电脑) 连续点击版本号5次 在系统和更新中点击开发者选项 打开USB调试功能 PC端操作流程 打开cmd或powershell 移动到adb.exe所在 ...
- Neo4j常用操作——Cypher查询语言
1. 删除数据库中以往的图,确保一个空白的环境进行操作: MATCH (n) DETACH DELETE n # 要想删除数据库的话直接删除文件即可 2. 创建一个人物节点: CREATE (n:Pe ...
- 多台服务器之间配置ssh免密登录
需求:假设有N台服务器,N台服务器之间都需要配置相互间免密登录 步骤1:在一台服务器上安装ansible yum -y install epel-release && yum -y ...
- How to implement UDP protocal
Server implementation Open a socket on the server that listens to the UDP requests. (I've chosen 888 ...
- 5.根据uid获取用户所有收货地址信息和设置默认地址
1.总结:昨天主要是实现了根据uid获取该用户的所有收货地址以及设置默认地址:再对默认地址的实现里面让我认识到它的具体操作,首先我们根据aid查询收货地址 再根据收货地址查询到地址归属人的信息,判断u ...
- 为什么一定要用Redis?
参考: 为什么分布式一定要有Redis? 选redis还是memcache,源码怎么说?
- jmeter参数化导致反斜杠(\)被转义
前情提要:在用jmeter做接口测试时,对请求体进行参数化,执行结果报错.但在不参数化的情况下,执行结果成功,而且参数化后,请求中读取到的参数是正确的(执行失败与执行成功时的参数一致). 问题排查:参 ...
- 2023成都.NET线下技术沙龙圆满结束
2023年4月15日周六,由MASA技术团队和成都.NET俱乐部共同主办的2023年成都.NET线下技术沙龙活动在成都市世纪城新会展中心知域空间举行,共计报名人数90多人,实际到场60多人,13:30 ...
- Yapi及Swgger使用+注解
1.Yapi 1.1 介绍 YApi 是高效.易用.功能强大的 api 管理平台,旨在为开发.产品.测试人员提供更优雅的接口管理服务.可以帮助开发者轻松创建.发布.维护 API,YApi 还为用户提供 ...