zoukankan      html  css  js  c++  java
  • Linux C/C++编程之(九)静态库的制作和使用

    一、概述

    在这里插入图片描述

    二、静态库的优缺点

    优点:

    • 寻址方便,速度快
    • 库被打包到可执行程序中,直接发布可执行程序即可使用

    缺点:

    • 静态库的代码在编译过程中已经被载入可执行程序,因此体积较大
    • 如果静态函数库改变了,那么你的程序必须重新编译

    使用场合:

    • 在核心程序上使用,保证速度,可忽视空间
    • 主流应用于80、90年代,现在很少用

    三、静态库的制作

    (1)制作步骤

    1)编译得到 *.o文件

    gcc a.c b.c c.c -c
    

    2)打包得到静态库 libmytest.a(就是一个打包.o文件的过程)

    ar rcs libmytest.a a.o b.o c.o
    
    • ar工具不包含在gcc中
    • r–>将文件插入静态库中
    • c–>创建静态库,不管库是否存在
    • s–>写入一个目标文件索引到库中,或者更新一个存在的目标文件索引。

    查看库中的符号(函数、全局变量等):nm libmytest.a

    3)使用静态库

    gcc + 源文件 + -L静态库路径 + 静态库名 + -l头文件目录 + o可执行文件名
    gcc main.c -L ./-lmytest -l ./ -o app
    
    • -L–>指定库所在的路径
    • -l–>指定库的名字
      • 去掉前缀lib
      • 去掉后缀 .a
      • 只留下中间部分
    • -l–>头文件目录位置
    gcc + 源文件 + 头文件 + libxxx.a
    

    生成的静态库需要跟对应的头文件同时发布

    • 头文件中存放的是函数接口(函数声明)

    (2)实际操作

    文件内容及路径分布如下:

    gxl@gxl-virtual-machine:~/linux/jingtai$ tree
    .
    ├── include
    │   └── head.h
    ├── lib
    ├── main.c
    └── src
        ├── add.c
        └── sub.c
    

    //head.h

    //head.h
    #include<stdio.h>
    
    int add(int a, int b);
    int sub(int a, int b);
    

    在这里插入图片描述
    //add.c

    //add.c
    #include"head.h"                                                                                                                   
    
    int add(int a,int b)
    {
    	return a+b;
    }
    

    在这里插入图片描述
    //sub.c

    //sub.c
    #include"head.h"                                                                                                                   
    
    int sub(int a,int b)
    {
    	return a-b;
    }
    

    在这里插入图片描述

    #include "head.h"
    
    int main(void)
    {
    	int a = 10, b = 10;
    	
    	printf("%d + %d is %d
    ", a, b, add(a, b));
    	printf("%d - %d is %d
    ", a, b, sub(a, b));
    	
    	return 0;
    }
    

    在这里插入图片描述

    • 编译为 .o 文件,进入到 src 目录下执行:
      在这里插入图片描述

    • 将 .o 文件打包,制作成 libCalc.a 静态库
      在这里插入图片描述
      编译时需要加静态库名(记得路径),-I 包含头文件

    • 使用静态库编译 main.c并执行 main,我们将 libCalc.a 移动到上层的 lib 中并退回到 calc 目录,编译 main.c 并执行:
      在这里插入图片描述

    • 可以用 nm 命令查看文件内容:
      在这里插入图片描述

    四、静态库

    在这里插入图片描述

  • 相关阅读:
    js实现粘贴板复制
    oracle分页查询
    [小技巧]window10删除此电脑左侧栏中的非磁盘文件夹
    [web]2019第一起数据泄露事件
    [xml]AttributeError: 'xml.etree.ElementTree.Element' object has no attribute 'getroot'
    [python]Mongodb
    [urllib]urlretrieve在python3
    [flask]邮件配置-20171227
    [PowerShell]Python虚拟环境激活失败
    [git]git入门
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13302541.html
Copyright © 2011-2022 走看看