Linux下C/C++动静态库

设有如下方法add 的声明和定义

声明 myadd.h

Linux下C/C++动静态库_第1张图片

 定义 myadd.c mysub.c

Linux下C/C++动静态库_第2张图片

Linux下C/C++动静态库_第3张图片

 我们想把此方法提供给别人使用,但我们并不想提供源码

此时就需要使用库来解决

什么是库?

库就是方法们编译为二进制码后整合在一起。供程序链接。

动态库 libxxx.so

运行时把库代码加载到内存,通过页表映射到虚拟地址空间的共享区,当程序需要方法时,再跳转去执行库中的代码,程序本身没有方法的代码。因此程序运行依赖库文件,无法独立运行

静态库 libxxx.a

编译时把库中代码拷贝链接到程序里,运行时执行自己的代码,可以独立运行,不依赖库文件。

如何生成

静态库

1.将方法编译为.o文件(二进制码)

此时已经可以交给他人使用 但是并不规范

Linux下C/C++动静态库_第4张图片

2.利用归档工具ar 整合.o文件为静态库

动态库

1.编译出与位置无关码(编译时添加 -fPIC选项 )

动态库需要与位置无关码是因为 程序需要在运行时再去找库的代码,库和进程地址空间独立

Linux下C/C++动静态库_第5张图片

2.利用gcc/g++ 将.o文件再次编译为动态库

在编译时添加 -shared 选项 表示编译为动态库,需要确保.o文件为 fPIC形式

如何使用

例有如下代码 mytest.c

Linux下C/C++动静态库_第6张图片

如何只利用我们上面生成的动静态库让这段代码跑起来呢

静态库 libmymath.a

Linux下C/C++动静态库_第7张图片

1.-L 指定库路径

编译器会默认到系统库目录去找 所以需要 -L 指定库路径 或把库拷贝到系统库路径或者建立软硬链接(造成命名污染,不推荐)

2. -l 指定库名

库名需要去掉前缀(lib)和后缀(.a/.so) 这一步比较特殊 

运行结果无误Linux下C/C++动静态库_第8张图片

动态库 libmymath.so

Linux下C/C++动静态库_第9张图片

1.-L 指定库目录 -l 指定库名 

此时运行, 可能出错

程序运行时找不到动态库

因为程序一旦编译出来 就与编译器无关了 ,经过了编译操作系统只知道这个进程依赖那些库,程序运行起来后 却可能不知道操作系统不知道去哪里 把库加到内存,因此我们需要执行第二步

2.添加环境变量(推荐)

 你也可以直接把库拷贝到系统库路径(或建立软硬链接)或添加配置文件->都可能造成命名污染 (不推荐)

我们env 中有一个环境变量LD_LIBRARY_PATH 来保存默认的库的路径

 我们往这个环境变量中添加库所在的路径 ,动态库就能被正确的加载到内存了

Linux下C/C++动静态库_第10张图片

此时程序能正确运行

你可能感兴趣的:(Linux,linux,c语言,c++)