zoukankan      html  css  js  c++  java
  • c语言中静态链接库的创建和使用

    静态链接库的创建

    静态链接库其实就相当于压缩包,其内部可以包含多个源文件。但需要注意的是,并非任何一个源文件都可以被加工成静态链接库,其至少需要满足以下 2 个条件:

    • 源文件中只提供可以重复使用的代码,例如函数、设计好的类等,不能包含 main 主函数;
    • 源文件在实现具备模块功能的同时,还要提供访问它的接口,也就是包含各个功能模块声明部分的头文件。


    显然对于 demo 项目中的 add.c、sub.c 以及 div.c 这 3 个源文件来说,以上 2 个条件都符合,因此都可以被加工成静态链接库。并且根据实际需要,我们可以将它们集体压缩到一个静态链接库中,也可以各自压缩成一个静态链接库。

    将源文件打包为静态链接库的过程很简单,只需经历以下 2 个步骤:
    1) 将所有指定的源文件,都编译成相应的目标文件:

    [root@bogon demo]# gcc -c sub.c add.c div.c
    [root@bogon demo]# ls
    add.c  add.o  div.c  div.o  main.c  sub.c  sub.o  test.h
    View Code

    2) 然后使用 ar 压缩指令,将生成的目标文件打包成静态链接库,其基本格式如下:

    ar rcs 静态链接库名称 目标文件1 目标文件2 ...

    有关 ar 打包压缩指令,以及 rcs 各选项的含义和功能,感兴趣的读者可自行查找相关资料了解。这里需要重点说明的是,静态链接库的不能随意起名,需遵循如下的命名规则:

    libxxx.a

    Linux 系统下,静态链接库的后缀名为 .a;Windows 系统下,静态链接库的后缀名为 .lib。

    其中,xxx 代指我们为该库起的名字,比如 Linux 系统自带的一些静态链接库名称为 libc.a、libgcc.a、libm.a,它们的名称分别为 c、gcc 和 m。

    下面,我们尝试将 add.o、sub.o 和 div.o 打包到一个静态链接库中:

    [root@bogon demo]# ar rcs libmymath.a add.o sub.o div.o
    [root@bogon demo]# ls
    add.c  add.o  div.c  div.o  libmymath.a  main.c  sub.c  sub.o  test.h

    其中,libmymath.a 就是 add.o、sub.o 和 div.o 一起打包生成的静态链接库,mymath 是我们自定义的库名。

    通过以上 2 步操作,我们就成功创建出了 libmymath.a 静态链接库。那么,该如何使用它呢?

    静态链接库的使用

    静态链接库的使用很简单,就是在程序的链接阶段,将静态链接库和其他目标文件一起执行链接操作,从而生成可执行文件。

    以 demo 项目为例,首先我们将 main.c 文件编译为目标文件:

    [root@bogon demo]# gcc -c main.c
    [root@bogon demo]# ls
    add.c  div.c  libmymath.a  main.o  sub.c
    test.h  add.o  div.o  main.c  sub.o

    在此基础上,我们可以直接执行如下命令,即可完成链接操作:

    [root@bogon demo]# gcc -static main.o libmymath.a
    [root@bogon demo]# ls
    add.c  a.out  div.o        main.c  sub.c  test.h
    add.o  div.c  libmymath.a  main.o  sub.o

    其中,-static 选项强制 GCC 编译器使用静态链接库。

    注意,如果 GCC 编译器提示无法找到 libmymath.a,还可以使用如下方式完成链接操作:

    [root@bogon demo]# gcc main.o -static -L /root/demo/ -lmymath
    [root@bogon demo]# ls
    add.c  a.out  div.o        main.c  sub.c  test.h
    add.o  div.c  libmymath.a  main.o  sub.o

    其中,-L(大写的 L)选项用于向 GCC 编译器指明静态链接库的存储位置(可以借助 pwd 指令查看具体的存储位置); -l(小写的 L)选项用于指明所需静态链接库的名称,注意这里的名称指的是 xxx 部分,且建议将 -l 和 xxx 直接连用(即 -lxxx),中间不需有空格。

    由此,就生成了 a.out 可执行文件:

    [root@bogon demo]# ./a.out
    Input two numbers: 10 2
    10+2=12
    10-2=8
    10÷2=5

    参考文档:

    http://c.biancheng.net/view/8020.html

  • 相关阅读:
    练习5
    图例设置了却不显示
    easyui中多级表头,主表头不能添加field字段,否则不居中
    springboot热部署
    ReactDom.render调用后没有渲染
    webpack打包配置模板
    overridePendingTransition
    multiDex分包时指定主dex的class列表
    android实现手势锁
    动态补丁构建工具nuwa中的“坑”
  • 原文地址:https://www.cnblogs.com/dylancao/p/13936145.html
Copyright © 2011-2022 走看看