一 静态库的制作和使用
库文件分为两种 静态库文件 动态库文件
静态库文件 使用静态库文件链接生成可执行文件的时候,采用静态链接的方式.
文件的命名规则: lib库名.a
制作和使用的步骤:
1 将所有要加入静态库的模块编译为目标文件.
tarena@ubuntu:~/uc/day03/t_math$ ls
add.c main.c mul.c p_math.h
tarena@ubuntu:~/uc/day03/t_math$ gcc -c add.c mul.c tarena@ubuntu:~/uc/day03/t_math$ ls
add.c add.o main.c mul.c mul.o p_math.h

2 将第一步生成的目标文件打包到静态库文件中
tarena@ubuntu:~/uc/day03/t_math$ ar -r libpmath.a *.o
ar: 正在创建 libpmath.a
tarena@ubuntu:~/uc/day03/t_math$ ls
add.c libpmath.a mul.c p_math.h
add.o main.c mul.o

3 使用静态库文件链接生成可执行文件
tarena@ubuntu:~/uc/day03/t_math$ gcc -c main.c
tarena@ubuntu:~/uc/day03/t_math$ gcc main.o -L. -lpmath
tarena@ubuntu:~/uc/day03/t_math$ ls
add.c a.out main.c mul.c p_math.h
add.o libpmath.a main.o mul.o
tarena@ubuntu:~/uc/day03/t_math$ ./a.out
6+2=8
-L路径 链接器寻找库文件的路径
-l库名 指定要找的库的名字

二 环境变量
进程的概念
程序和进程
程序是计算机指令的集合.磁盘上的,静态的
进程是程序运行的实例.将程序加载到内存执行的时候,称作进程.
动态的.
一个程序运行一次,期间就是进程.程序运行完毕进程就结束了.
进程分为用户级进程 系统级进程
所有的用户级进程构成了一颗进程树.
pstree(1) 可以查看用户级进程树

进程间的关系 父子关系 兄弟关系
每个进程都维护着一个环境变量的列表.进程可以使用这些环境变量指定的值去访问计算机系统的相关资源.

bash这个进程的环境变量.
bash进程有两种类型的变量 自定义类型的变量 环境变量
环境变量是可以被子进程继承的变量.
自定义变量是进程私有的,不能被子进程继承.

如何查看bash进程的环境变量列表
env(1)
USER=tarena //这是环境变量的组织格式
$name 取环境变量的值
USER=beijing 如果有这个环境变量,将环境变量的值改为beijing
如果没有这个环境变量,将这个变量添加到进程的自定义变量列表中.
注意一点 =的两边绝对的不允许出现空格

export name 将name设定为环境变量
unset name 删除环境变量
PS1 自定义变量
指定了bash的提示符
tarena@ubuntu:~/uc/day03/t_math$ echo KaTeX parse error: Expected 'EOF', got '\[' at position 5: PS1 \̲[̲\e]0;\u@\h: \w\…{debian_chroot:+($debian_chroot)}[\033[01;32m]\u@\h[\033[00m]:[\033[01;34m]\w[\033[00m]$

tarena@ubuntu:~/uc/day03/t_math$ env|grep PS1

PS1="\W$"

bash进程执行的时候,会执行一个脚本文件.通常将环境变量 自定义变量 别名定义在这个脚本文件中.
~/.bashrc

PATH 环境变量
~$echo $PATH
/home/tarena/Qt5.4.1/Tools/QtCreator/bin:/home/tarena/Qt5.4.1/5.4/gcc/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

在bash上输入a.out的时候,执行当前路径下的a.out可执行文件.
PATH=/home/tarena/Qt5.4.1/Tools/QtCreator/bin:/home/tarena/Qt5.4.1/5.4/gcc/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:.

export PATH=$PATH:.

三 动态库的制作和使用
动态库的命名规则: lib库名.so
制作和使用的步骤:
1 将要加入动态库的源文件编译为目标文件(与位置无关的目标文件)
t_math l s a d d . c m a i n . c m u l . c p m a t h . h t m a t h ls add.c main.c mul.c p_math.h t_math lsadd.cmain.cmul.cpm​ath.htm​athgcc -c -fPIC add.c mul.c
t_math$ls
add.c add.o main.c mul.c mul.o p_math.h

-fPIC:生成与位置无关的目标文件

2 将第一步生成的目标文件打包到动态库文件中
t_math g c c − s h a r e d − o l i b p m a t h . s o ∗ . o t m a t h gcc -shared -o libpmath.so *.o t_math gcc−shared−olibpmath.so∗.otm​athls
add.c libpmath.so mul.c p_math.h
add.o main.c mul.o

3 使用动态库链接生成可执行文件
t_math g c c m a i n . c − L . − l p m a t h t m a t h gcc main.c -L. -lpmath t_math gccmain.c−L.−lpmathtm​athls
add.c a.out main.c mul.o
add.o libpmath.so mul.c p_math.h

t_math$a.out
a.out: error while loading shared libraries: libpmath.so: cannot open shared object file: No such file or directory

使用静态库链接生成的可执行文件.从静态库中找到程序中使用的模块,将这些模块合并到可执行文件中.可执行文件是独立的文件.不再依赖静态库文件.

使用动态库生成的可执行文件.和动态库是两个独立的模块.这种可执行文件要执行的时候,必须将可执行文件和动态库一起加载到内存.
需要指到可执行文件依赖哪些动态库文件?
ldd a.out
告诉动态链接器到哪里去找动态库文件.
两种方法解决
1 使用LD_LIBRARY_PATH环境变量告诉动态链接器
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

2 链接器默认的搜索路径是/lib或者/usr/lib

地址分为三种
1 固定地址
2 与位置无关的目标文件地址 相对地址
3 程序运行的时候,需要使用到动态库的时候才加载到内存中

UC学习day03 静态库 环境变量 动态库相关推荐

  1. mysql.h 动态编译命令_Linux环境编译动态库和静态库总结

    对Linux环境动态库和静态库的一些基础知识做一些总结, 首先总结静态库的编译步骤. 1 先基于.cpp或者.c文件生成对应的.o文件 2将几个.o文件 使用ar -cr命令 生成libname.a文 ...

  2. Linux环境编译动态库和静态库总结

    首先总结静态库的编译步骤. 1 先基于.cpp或者.c文件生成对应的.o文件 2将几个.o文件 使用ar -cr命令 生成libname.a文件 libname.a 为静态库, name 为静态库的名 ...

  3. Linux动态库环境变量设置

    永久生效的环境变量设置,编辑/etc/profile即可. vi /etc/profile 在文件里末尾加上对应的环境变量信息. 动态库环境变量设置: export LD_LIBRARY_PATH=/ ...

  4. gcc生成静态库.a和动态库.so和OpenCV3.4.11的安装及使用示例

    gcc生成静态库.a和动态库.so和OpenCV3.4.11的安装及使用示例 文章目录 gcc生成静态库.a和动态库.so和OpenCV3.4.11的安装及使用示例 一.用gcc生成静态库和动态库 ( ...

  5. 【Android NDK 开发】Ubuntu 函数库交叉编译 ( Android 动态库交叉编译 | Android 静态库交叉编译 )

    文章目录 I . Ubuntu 中交叉编译 Android 动态库 II . Ubuntu 中交叉编译 Android 静态库 I . Ubuntu 中交叉编译 Android 动态库 1 . 要编译 ...

  6. linux库引入之动态库静态库(生成和使用)

    库: 库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.就是将源代码转化为二进制格式的源代码,相当于进行了加密,别人可以使用库,但是看不到库中的内容. 如何使用 用户需要同时具有头文件和库. ...

  7. [转]Linux下g++编译与使用静态库(.a)和动态库(.os) (+修正与解释)

    在windows环境下,我们通常在IDE如VS的工程中开发C++项目,对于生成和使用静态库(*.lib)与动态库(*.dll)可能都已经比较熟悉,但是,在linux环境下,则是另一套模式,对应的静态库 ...

  8. 在Linux中创建静态库.a和动态库.so

    转自:http://www.cnblogs.com/laojie4321/archive/2012/03/28/2421056.html 在Linux中创建静态库.a和动态库.so 我们通常把一些公用 ...

  9. gcc生成静态库.a和动态库.a以及Ubuntu18.04下opencv3.4.11安装及示例

    目录 一.用gcc生成静态库和动态库 (一)hello示例使用库 1.准备过程 2.静态库使用 3.动态库的使用 4.静态库与动态库比较 (二)示例1使用库 二.opencv安装以及使用 (一)认识o ...

  10. Linux静态库.a与动态库.so的生成与区别、以及.so库文件的封装与使用

    #一.前言 如果有公司需要使用你们产品的一部分功能(通过代码调用这些功能),如果不想提供源代码,那么就可以通过封装成库文件的形式提供给对方使用.本文主要介绍了生成动态库与静态库文件的过程.以及封装和使 ...

最新文章

  1. 一文读懂计算计仿真技术
  2. CSS中可以or不可以继承的属性
  3. C++ Primer 5th笔记(chap 17 标准库特殊设施)tuple 返回多个值
  4. Bitlocker and BitLocker To Go
  5. 图文了解 Kafka 的副本复制机制
  6. 以太网,局域网,万维网
  7. ORA-15096: lost disk write detected的解决与修复
  8. Use Amazon VM to try Openstack (1) (with DevStack)
  9. ubuntu 下安装和配置selenium
  10. 潭州课堂25班:Ph201805201 第十课 类的定义,属性和方法 (课堂笔记)
  11. 东北大学计算机生源,辽宁省2021年普通高校招生计划,东北大学、大连理工大学没有扩招...
  12. 使用section.key的形式读取ini配置项
  13. 前端做微信好友分享_一篇搞定微信分享和line分享
  14. rails 查询 where条件用法
  15. ctf-web-秋名山车神
  16. 开机后黑屏看不到桌面_教你win10电脑开机后黑屏进不了桌面的排查解决方案
  17. android 获取文件大小
  18. L2-015 互评成绩(Python3)
  19. SharePoint 2013 OWA(Office Web Apps) 连接与配置
  20. 数据库领域的未来发展趋势是怎样的?

热门文章

  1. Hive架构简述及工作原理
  2. BJOI2017 喷式水战改
  3. Altium designer之生成Gerber打板文件
  4. 印度庙墓堡之旅之二:探访ISKCON Temple
  5. 【Minecraft 统一通行证】加入X_STAR服务器
  6. Starting namenodes on [single] single: ssh: connect to host single port 22: Connection refused
  7. 人体姿势识别简单实现
  8. Swift-MVVM 简单演练(四)
  9. 输出9*9乘法口诀表
  10. 启动控制面板命令大全