linux并发服务器 —— 动态库和静态库实战(一)

-E 预处理指定源文件

-S 编译指定源文件

-c 汇编指定源文件

-o 生成可执行文件

-I directory 指定Include包含文件的搜索目录

-g 编译的时候生成调试信息

-D 在程序编译时指定一个宏

-w 不生成任何的警告信息

-Wall 生成所有警告

-On n:0~3;表示编译器的优化选项级别 O0 - 不优化;O1 - 缺省值;O3 - 优化级别最高

-l 编译时指定库

-L 编译时指定库的路径

-fpic 生成与位置无关的代码

-shared 生成共享目标文件

-std 指定方言 -std=c++11

gcc编译.c;g++编译.cpp即可

在编译阶段g++会自动调用gcc 二者等价

静态库的制作

库的好处:代码保密;方便部署和分发;

静态库:在程序的链接阶段被复制到程序中

命名规则:linux-libxxx.a;windows-libxxx.lib;lib为前缀,xxx为库名

制作步骤:

1. gcc获得.o文件

2. .o文件用ar工具打包  ar rcs libxxx.a xxx.o xxx.o

linux并发服务器 —— 动态库和静态库实战(一)_第1张图片

 静态库的使用

gcc main.c -o app -I ./include/ -l calc -L ./lib;-I 提供头文件目录,-L 指定库的路径,-l 库的名称

linux并发服务器 —— 动态库和静态库实战(一)_第2张图片

 

动态库的制作与使用

动态库:在链接阶段没有复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用

命名规则:linux - libxxx.so;windows - libxxx.dll;

制作流程:

1. gcc得到.o文件,生成和位置无关的代码(-fpic)

2. gcc得到动态库(-shared)

linux并发服务器 —— 动态库和静态库实战(一)_第3张图片

 动态库加载失败的原因:程序启动时,动态库被动态加载到内存中(使用到动态库中的API时才会加载)。需要ldd检查动态库依赖关系

 需要系统的动态载入器(ld-linux.so)来获取所依赖库的绝对路径,先检查虚拟地址空间、LD_LIBRARY_PATH、/etc/ld.so.cache、/lib/(/user/lib)将动态库加载到内存中;

解决办法:在动态载入器查找范围内,加入动态库即可。

eg. 配置环境变量(LD_LIBRARY_PATH)

linux并发服务器 —— 动态库和静态库实战(一)_第4张图片

 但配置的环境变量是临时了,新开中断没有。永久配置环境变量的方法:1. 用户级别;2. 系统级别

用户级别的配置:在.bashrc中添加上述环境变量

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/nowcoder/linux/lesson06/library/lib

. .bashrc更新即可;

系统级别的配置:sudo vim/etc/profile

eg. 配置文件列表

通过添加库绝对路径在/etc/ld/so/conf;sudo ldconfig更新即可

eg. 将动态库文件放置在/lib/(/user/lib)下(不建议,可能会替换系统本身的文件)

静态库的优缺点

+ 静态库被打包到应用程序中加载速度快

+ 发布程序无需提供静态库,移植方便

- 消耗系统资源、更新内存

- 更新、部署、发布麻烦

动态库的优缺点

+ 进程间资源共享(共享库)

+ 更新、部署、发布简单

+ 可控制加载动态库的时间

- 加载速度慢

- 发布程序需要提供依赖的动态库

你可能感兴趣的:(笔记)