静态静态库 动态链接库

一、静态链接库

        静态库由ar工具创建。编译应用程序和静态库链接时,链接器将静态库中被调用的对象嵌入至可执行映像文件中,这样在没有静态库的环境下,应用程序也能独立运行。静态库文件的命名规则是libxxx.a,以lib开头,.a作为文件名后缀

1、静态库管理工具ar

ar [option] file.a objects
       -c        创建一个函数库
       -d        从函数库中删除目标文件
       -t        显示函数库中目标对象列表
       -r        向函数库中插入目标对象,若存在则替换
       -u        若函数库中已经存在同名目标,则用新目标更新
       -x        从函数库中提取一个目标对象
       -v        显示ar的版本信息

如,有test1.c,test2.c两个文件,要创建静态库文件libtest.a

gcc -Wall -c test1.c test2.c
ar -cru libtest.a test1.o test2.o

2、使用静态库

使用静态库需要定义静态库的应用接口

//func.h
#ifndef _FUNC_API_H
#define _FUNC_API_H

//function1和function2分别是test1.c和test2.c中的函数
extern int function1();
extern int function2();

#endif

假如有main.c文件使用libtest.a静态库

gcc -o test main.c -L. -ltest

二、动态链接库

经过编译后应用程序在和动态库链接时,链接器在库中检查所需的符号信息(如,函数和变量),只在生成可执行文件中记录这些信息的来源。应用程序运行中调用时,才把目标对象加载入内存中。因此当动态库不存在时,程序无法运行。动态链接库的命名规则是libxxx.so

1、创建动态库

gcc -fPIC -c test1.c  #生成目标文件test1.o
gcc -fPIC -c test2.c
gcc -shared test1.o test2.o -o test.so

-fPIC 选项是告诉gcc创建地址独立了目标文件,选项-shared告诉gcc创建一个共享库


2、使用动态库

使用动态库不需要自己编写应用接口,Linux环境下提供了一组API

#include <dlfcn.h>                           
void *dlopen(const char *filename,int flag);  //打开动态链接库,打开成功返回链接库“句柄”
const char *dlerror(void);                    //检查动态库操作是否失败,成功返回NULL
void *dlsym(void *handle,char *symbol);       //取函数执行地址
int dlcolse(void *handle);                    //关闭动态链接库

有了这组API就可以使用动态库了

编译链接

gcc -rdynamic -o test main.c -ldl

在运行的时候可能会出现找不到动态库的情况,就算链接库就在可执行程序目录下。这里有两种解决方案







你可能感兴趣的:(静态静态库 动态链接库)