c的静态库和动态库

1(1)库文件:静态库文件 和 共享库文件
(2)比较
a.静态库文件:
使用静态库文件时,直接把代码/指令复制到目标文件中
目标文件会显得比较庞大,修改和维护都不方便
可以脱离静态库文件,效率比较高

b.共享库文件:
使用共享库时,将代码/指令所对应的地址复制到目标文件
目标文件会比较小,修改和维护比较方便
不可以脱离共享库文件,效率比较低
(3)基本命令
ldd a.out => 查看文件a.out所依赖的库文件
gcc/cc -static xxx.c => 要求按照静态库方式编译链接,得到的可执行文件会比较大

2 静态库文件的生成和使用
(1)静态库文件的生成步骤
a.编写源代码xxx.c,如:vi adder.c
b.只编译不链接生成.o的目标文件
gcc/cc -c adder.c
c.使用命令ar -r/*插入*/ lib库名.a xxx.o 生成静态库
ar -r libadder.a adder.o
注意:
a.lib库名.a 叫做静态库文件名,与库名不同,注意区分
b.静态库文件的命名规则一般为lib开头,.a为后缀,中间的库名自定义即可

(2)静态库文件的使用步骤
a.编写源程序xxx.c,如:vi main.c
b.只编译不链接,生成目标文件.o
如: cc -c main.c
c.连接目标文件和静态库文件
1)直接连接
  cc main.o libadder.a
2)通过选项进行连接(掌握)
  cc main.o -l 库名 -L 库文件所在的路径
  cc main.o -l adder -L .
3)配置环境变量LIBARARY_PATH
  export LIBRARY_PATH=$LIBRARY_PATH:.
  cc main.o -l adder

3.3 共享库的生成和使用步骤
(1)共享库的生成步骤
  a.编写源程序xxx.c,如 vi adder.c
b.只编译不链接生成.o目标文件
  gcc/cc -c -fpic/*小模式*/ adder.c
c.使用编译选项生成共享库文件
  gcc/cc -shared/*共享*/ adder.o -o lib库名.so
(2)共享库的使用步骤
a.编写测试程序xxx.c,如 vi main.c
b.只编译不链接生成.o目标文件
  如: cc -c main.c
c.连接测试文件和共享库文件
1)直接连接
  cc main.o libadder.so
2)使用编译选项进行连接(掌握)
  cc main.o -l adder -L .
3)配置环境变量LIBRARY_PATH
  export LIBRARY_PATH=$LIBRARY_PATH:.
  cc main.o -l adder
注意:
对于共享库文件的使用来说,要求配置LD_LIBRARY_PATH
  export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

共享库的动态加载
(1)dlopen函数
#include <dlfcn.h>
void *dlopen(const char *filename, int flag);
第一个参数:字符串形式的文件名
第二个参数:加载标志
RTLD_LAZY - 延迟加载
RTLD_NOW - 立即加载
返回值:返回共享库文件的句柄/地址
函数功能:打开和加载共享库文件,根据返回值来可以
操作该共享库文件

(2)dlerror函数
char *dlerror(void);
函数功能:
主要用于获取dlopen()/dlsym()/dlclose()/函数调用期间发生的最新错误信息,
通过返回值返回,返回NULL则没有错误

(3)dlsym函数
void *dlsym(void *handle, const char *symbol);
第一个参数:dlopen函数的返回值
第二个参数:标识,一般用于查找具体的函数名
返回值:返回标识在内存中的地址
函数功能:
根据handle在对应的共享库中查找名字为symbol标识的地址

(4)dlclose函数
int dlclose(void *handle);
函数功能:
表示关闭handle所对应的共享库文件

注意:
连接的时候需要指定选项: -ldl

动态库使用示例:

//加法计算的头文件
#ifndef ADDER_H
#define ADDER_H

//计算两个int类型参数的和
int add_int(int ia,int ib);
//计算两个double类型参数的和
double add_double(double da,double db);

#endif
//加法计算的源文件
#include "adder.h"
//#include "../adder.h"

//计算两个int类型参数的和
int add_int(int ia,int ib)
{
    return ia + ib;
}

//计算两个double类型参数的和
double add_double(double da,double db)
{
    return da + db;
}
//共享库的动态加载
#include <stdio.h>
#include <dlfcn.h>

int main(void)
{
    //1.打开和加载共享库文件
    void* handler = dlopen("./shared/libadder.so",RTLD_NOW);
    //2.判断是否出错
    char* error = dlerror();
    if(error != NULL)
    {
        printf("加载共享库文件失败\n");
        return -1;
    }
    //3.寻找共享库中指定的标识
    int (*add_pint)(int ia,int ib);
    add_pint = dlsym(handler,"add_int");
    //4.判断是否出错
    error = dlerror();
    if(error != NULL)
    {
        printf("获取标识失败\n");
        return -1;
    }
    //5.使用标识进行处理
    printf("计算的结果是:%d\n",add_pint(10,20));//30
    //6.关闭共享库文件
    dlclose(handler);
    return 0;
}
时间: 2024-11-05 14:42:03

c的静态库和动态库的相关文章

静态库和动态库的分析

本质上来说库是一种可执行代码的二进制形式. linux下的库有两种:静态库和共享库(动态库) 静态库在程序编译时会被连接到目标代码中:程序运行时将不再需要该静态库,因此体积较大. 优点:程序运行时将不再需要该静态库 缺点:可执行文件的体积较大. 相同的库可能会需要被多次加载. 静态库: libxxxxx.a 动态库:动态库在程序编译时并不会被连接到目标代码中, 优点: 在程序运行时动态库才会被载入内存,因此代码体积较小. 缺点: 因此在程序运行时还需要动态库存在. 静态库的制作:将功能函数编译成

iOS 中的静态库与动态库,区别、制作和使用

如果我们有些功能要给别人用,但是又不想公开代码实现,比如高德地图.第三方登录分享等等,这时候我们就要打包成库了.库分静态库和动态库两种: 静态库:以.a 和 .framework为文件后缀名.动态库:以.tbd(之前叫.dylib) 和 .framework 为文件后缀名. 静态库与动态库的区别 静态库:链接时会被完整的复制到可执行文件中,被多次使用就有多份拷贝.动态库:链接时不复制,程序运行时由系统动态加载到内存,系统只加载一次,多个程序共用(如系统的UIKit.framework等),节省内

linux上静态库和动态库的编译和使用(附外部符号错误浅谈)

主要参考博客gcc创建和使用静态库和动态库 对于熟悉windows的同学,linux上的静态库.a相当于win的.lib,动态库.so相当于win的.dll. 首先简要地解释下这两种函数库的区别,参考<Linux程序设计> 1. 静态库也被称为归档文件(archive,因此创建命令是ar),编译器和链接器负责将程序代码和静态库结合在一起组成单独的可执行文件: 但是缺点是许多应用程序同时运行并使用来自同一个静态库的函数时,内存中就会有一个函数的多份副本,而且程序文件自身也有多份同样的副本,这将消

Linux使用静态库和动态库

Linux使用静态库和动态库 (一)库的概念 库是可以复用的代码,在一些大的项目中常常会用到库. 本质上说:库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 一般说库是说两种: 静态库:linux下.a文件.windows下.lib文件 动态库:linux下.so文件.windows下.dll文件 最近花了一些时间把linux下编译.链接等研究了一下,作为一个菜鸟记录并分享一蛤. (二)静态库与动态库 程序的编译运行要经过以下步骤: 1.源文件(.h .cpp等) 2.预编译 3.编

Linux下Gcc生成和使用静态库和动态库详解

参考文章:http://blog.chinaunix.net/uid-23592843-id-223539.html 一.基本概念 1.1什么是库 在windows平台和linux平台下都大量存在着库. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同(主要是编译器.汇编器和连接器的不同),因此二者库的二进制是不兼容的. 本文仅限于介绍linux下的库. 1.2库的种类 linux下的库有两种:静态库和共享库(动态库). 二者的不同

静态库和动态库

简介 什么是库? 库是程序代码的集合,是共享程序代码的一种方式 根据源代码的公开情况,库可以分为2种类型 开源库 公开源代码,能看到具体实现 比如SDWebImage.AFNetworking 闭源库 不公开源代码,是经过编译后的二进制文件,看不到具体实现 主要分为:静态库.动态库 为什么制作闭源库 国内的企业,掌握有核心技术,同时是又希望更多的程序员来使用其技术,因此采用"闭源"的方式开发使用 例如:百度地图,友盟,JPush等 在企业开发中,一些核心技术或者常用框架,出于安全性和稳

linux学习 建立静态库,动态库,写简单的makefile

建立静态库 建立四个文件 bin(可执行文件),lib(库),include(头文件),src(放源文件) 这里的起的库明为add 在src文件中执行 1)gcc -c add.c //编译add.c源文件生成add.o目标文件 2)ar crsv ../lib/ libadd.a add.o //对目标文件*.o进行归档,生成lib*.a, 把这个生成文件放在lib里 3)gcc -o main main.c -L(大些的爱偶,放库的路径)../lib   –l(小写的爱偶,库名为add) a

【转】Linux下gcc生成和使用静态库和动态库详解

一.基本概念 1.1 什么是库 在Windows平台和Linux平台下都大量存在着库. 本质上来说,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行. 由于windows和linux的平台不同(主要是编译器.汇编器和连接器的不同),因此二者的库的二进制是不兼容的. 本文仅限于介绍linux下的库. 1.2 库的种类 linux下的库有两种:静态库和共享库(动态库). 二者的不同点在于代码被载入的时刻不同. 静态库的代码在编译过程中已经被载入可执行程序,因此体积较大. 共享库的代码是在可

C++静态库与动态库(比较透彻)

这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一本书<程序员的自我修养——链接.装载与库>. 什么是库 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.库有两种:静态库(.a..lib)和动态库(.so..

(转)HelloWorld CMake CMake中构建静态库与动态库及其使用

继续完善Hello World,建立它的共享库, 包括静态库和动态库. 本节的任务: 1,建立一个静态库和动态库,提供HelloFunc函数供其他程序编程使用,HelloFunc 向终端输出Hello World字符串. 2,安装头文件与共享库. 3, 编写一个程序使用创建的共享库(静态库和动态库). cd /home/ccj/CMakeDemo mkdir t3   cd /backup/cmake/t3 mkdir lib   在t3目录下建立CMakeLists.txt,内容如下: PRO