zoukankan      html  css  js  c++  java
  • Linux编程简介——静态链接库

    有时我们需要将一组代码编成一个库,从而方便其复用。例如,我们调用的STL和系统函数都是以这种方式提供的。另外,当项目工程较大时,为了使其模块化方便分工,有时也需要将其创建自己的链接库。

    链接库按照其链接方式可以分为动态链接库和静态链接库两种,本文主要介绍一下静态链接库的创建方式。

    以一个简单的代码为例,这里有两个文件main.c和stack.c,这里打算把stack.c作为一个lib供main.c调用。

        /* stack.c */
        char stack[512];
        int top = -1;

        char pop(void)
        {
            return stack[top--];
        }

        void push(char c)
        {
            stack[++top] = c;
        }

        /* main.c */
        #include <stdio.h>

        char pop();
        void push(char c);

        void main(void)
        {
            push('a');
            push('b');

            printf("%c\n", pop());
        }

    要把stack.c编成lib,需要经过如下两个步骤:

    1. 通过gcc –c命令将stack.c编成stack.o
    2. 通过ar命令将stack.o封装成libstack.a

        gcc -c stack.c
        ar cr libstack.a stack.o

    执行完这两条命令后,就可以生成一个libstack.a的文件了,然后再链接的时候直接使用这个.a文件即可以生成执行文件。

        gcc -o run main.c -L. -lstack

    这个链接命令并没有什么太多可介绍的,其中-L、-l参数用于指定链接库,在上一篇文章中已经介绍过,这里就不做更多说明了。

    上述过程中,用到了条之前没见过的命令ar。ar是archive的缩写,也就是归档的意思,平时我们用得更多的是另一条归档命令tar。ar和tar的功能其实比较类似,但ar命令做了一些额外的处理,它会为被归档的目标文件中的符号建立索引,当和应用程序链接时,建立的这些索引将回收链接过程

    ar命令的参数比较多,如果只是创建lib库的话,通常只用到了cr这两个组合参数。该命令是可以接受多个输入文件,统一合并到一个库中。

        ar cr libtest.a first.o second.o third.o

    在通过ar创建lib后,可以通过ar -t命令查看该lib里打包了那些.o文件

        tianfang > ar -t libstack.a
        stack.o

    此外,还可以通过nm命令来查看符号表等更多信息

        tianfang > nm libstack.a

        stack.o:
        00000000 T pop
        0000001b T push
        00000200 C stack
        00000000 D top

    ar和nm的命令参数比较多,更多信息可以参考这篇文章:AR和NM命令的使用

    最后,知道了ar只是一个打包的功能后,再回头来看看静态链接的过程,它其实只是把一堆.o文件打包成了一个.a文件,链接的时候仍然是从.a文件里面查找.o文件进行链接,和之前的编译方式并没有什么本质的区别。

  • 相关阅读:
    【Linux高频命令专题(7)】rm
    【Linux高频命令专题(6)】mkdir
    【mongoDB运维篇①】用户管理
    【Linux高频命令专题(5)】rmdir
    【mongoDB中级篇②】索引与expain
    【mongoDB中级篇①】游标cursor
    Lua中的字符串函数库
    ngx_lua 随笔
    Nginx与Lua
    MAC 上搭建lua
  • 原文地址:https://www.cnblogs.com/TianFang/p/2866952.html
Copyright © 2011-2022 走看看