Linux静态库与共享库

date: 2017-06-19 23:01:32

静态库与共享库

所谓“程序库”,简单说,就是包含了数据和执行码的文件。其不能单独执行,可以作为其他执行程序的一部分来完成某些功能。库的存在,可以使得程序模块化,可以加快程序的再编译,可以实现代码重用,可以使得程序便于升级。程序库可分为静态库(static library)和共享库(shared object)。

静态库,是在可执行程序运行前就已经加入到执行码中,成为执行程序的一部分;共享库,实在执行程序启动时加载到执行程序中,可以被多个执行程序共享使用,类似与windows下的dll文件。

静态库

静态库在应用程序生成时,可以不必再编译,节省再编译时间。但意义不大。当其他开发人员要使用我的程序,而我又不想给其源码,提供静态库是一种选择。 以.a结尾。
创建动态库或将目标代码加入到已经存在的静态库中,使用命令:

ar rcs libmylib.a file1.o

共享库

共享库的创建基本分两步。首先使用-fPIC或-fpic创建目标文件,PIC或pic表示位置无关代码,然后就可以使用以下格式创建共享库了。下面是使用a.c和b.c创建库的示例:

gcc -fPIC -c a.c
gcc -fPIC -c b.c
gcc -shared -Wl -o libmylib.so a.o b.o
或
gcc -fPIC -c *.c
gcc -shared -Wl,-soname,libmylib.so.1 -o libmylib.so.1.0.1 a.o b.o

按共享库的命名惯例,每个共享库有三个文件名:realname,soname和linkername.
真正的库文件是realname,包含完整的共享库版本号。如libmylib.so.1.10
soname为库的主版本号。添加共享库路径之后,自动生成libmylib.so.1
linkname为软链接,编译链接阶段使用,方便makefile。当共享库版本改变时,不需要再修改makefile内容,需要手动创建。

ln -s libmyab.so.1.0.1 libmyab.so

添加共享库的路径:

1、修改/etc/ld.so.conf

sudo vi /etc/ld.so.conf

2、更新查找共享库的路径

sudo ldconfig -v

如果没有成功,可能需要删除ld.so.cache缓存文件

sudo rm /etc/ld.so.cache

ldd app 查看app所依赖的共库

yz@ubuntu14:~/桌面$ ldd app
linux-vdso.so.1 =>  (0x00007ffe41ffc000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f10f13f8000)
/lib64/ld-linux-x86-64.so.2 (0x00005570aedd1000)

体验

tree

├── add.h
├── lib
├── main.c
└── src
    ├── add.c
    └── add.h
cat main.c src/add.h src/add.c

#include <stdio.h>
#include "add.h"


int main(void)
{
	printf("%d
", add(4, 5));
	return 0;
}
#ifndef ADD_H_
#define ADD_H_

int add(int a, int b);

#endif
#include "add.h"

int add(int a, int b)
{
	return a + b;
}
cd src && gcc -fPIC -c add.c

在scr下产生了add.o文件

gcc -shared -Wl,-soname,libmyadd.so -o libmyadd.so.1.10 add.o

在scr下产生了libmyadd.so.1.10文件

ar rcs libmyadd.a add.o

在scr下产生了libmyadd.a文件

cp libmyadd.a libmyadd.so.1.10 ../lib/

将libmyadd.a libmyadd.so.1.10复制到lib文件夹中

cd ..
gcc main.c lib/libmyadd.a -o app
./app

输出9,静态库测试成功

sudo vim /etc/ld.so.conf

添加共享库路径:/home/yz/桌面/ku/lib

sudo ldconfig -v

更新共享库的路径,这时候在lib下产出了libmyadd.so.1 -> libmyadd.so.1.10

ln -s libmyadd.so.1.10 libmyadd.so

再创建一个linkname,不是必须的

gcc main.c lib/libmyadd.so -o app1
./app1

输出9,共享库测试成功

原文地址:https://www.cnblogs.com/cloudflow/p/13894138.html