zoukankan      html  css  js  c++  java
  • 静态链接库与动态链接库 (一)静态链接库的编译与使用

    1. 所谓静态链接库,说白了就是在你把写好的代码编译的时候,就把你引用的库一起给编进去了,从此后你编出来的执行程序跟外面都不再有任何关系,即使这个库更新了,你也搭不上边儿。

        其次,如果系统中许多类似的程序都需要用到这个库,那么各自在编译的时候都需要把这个库给编进去,浪费存储空间(加载到内存 里应该也是浪费内存空间的)。

        linux系统中静态库的名字一般叫xxx.a, 所以如果看到一个以 .a结束的文件那么它就是一个静态链接库文件。

        .a 文件实际上是多个.o(汇编生成的机器码文件)文件使用ar命令打包起来的,仅仅是为了方便使用,抛开.a 直接使用.o也是一样的。

    2. 上代码,看看静态库是如何被编译出来以及如何被使用的

       首先写一个sum.c,如下,很简单,里面只有一个Sum函数,把两个数相加的和返回

     int Sum(int Number1, int Number2)
     {
         return Number1 + Number2;
     }
    

      然后,写一个声明它的sum.h

    int Sum(int Number1, int Number2);
    

      最后,写主函数

     #include<stdio.h>
     #include<sum.h>
      
     void main()
     {
         int Num1 = 1;
         int Num2 = 2;
         int iRet = 0;
     
         iRet = Sum(Num1, Num2);
         printf("Num1 + Num2 = %d.", iRet);
         return;
    }
    

    3. 编译静态库,打开终端后用vim写代码

    lv@lenovo: $ ls
    main.c    sum.c    sum.h
    lv@lenovo: $ gcc -c sum.c
    lv@lenovo: $ ls
    main.c    sum.c    sum.h    sum.o
    lv@lenovo: $ 
    lv@lenovo: $ 
    lv@lenovo: $ ar cr libsum.a sum.o
    lv@lenovo: $ ls
    libsum.a    main.c        sum.c        sum.h        sum.o
    lv@lenovo: $
    

        其中ar命令解释如下

    ar rv libtest.a hello.o hello1.o
    

        生成一个库,库名字是test,链接时可以用-ltest链接。该库中存放了两个模块hello.o和hello1.o。选项前可以有‘-'字符,也可以没有

        编译主程序并运行:

    lv@lenovo: $ gcc -o sumappd main.c -L . -lsum
    lv@lenovo: $ ls
    libsum.a    main.o        sum.h        sumappd
    main.c        sum.c        sum.o
    lv@lenovo: $ ./sumappd 
    Num1 + Num2 = 3
    

     “-L .”指明了当前lib所在的路径是在本目录,-l表示链接libsum.a这个lib库。

  • 相关阅读:
    stutas2配置action
    Struts2 第一个入门小案例
    spring与mybati整合方法
    spring事务隔离级别以及脏读 不可重复读 幻影读
    socket编程基础
    ajax随笔
    多线程基础
    Mybatis中collection与association的区别
    Guideline 2.3.1
    苹果手机 apple pay 一不小心支付购买了自己不要的服务
  • 原文地址:https://www.cnblogs.com/lvchaoshun/p/5966212.html
Copyright © 2011-2022 走看看