• 动态库/静态库


    1.静态库:将程序运行所需要的库文件,在程序编译的时候,一起编译进去,这样程序运行的时候,就不需要环境中有特定的库文件才能正常运行了,但是相对来说,由于把库文件添加进去一起编译了,所以生成的可执行文件的内存就比较大。

      缺点:1.占用的空间大,造成空间的浪费。

         2.如果程序需要修改某一部分,就要重新对整个文件进行编译,链接。

       优点:程序移植方便,不需要考虑环境下是否有相应的库文件。

    比如设计数学运算工具模块
    mathmodel.h,  mathmodel.c
    main.c  用到了数学运行函数
    gcc  -o  main  main.c  mathmodel.c
    gcc  -o  mathmodel.o  -c  mathmodel.c  --第一步
    gcc  -o  main  main.c  mathmodel.o  --可把mathmodel.o装入库中(静态库, 动态库)

    静态库的制作步骤:

    把mathmodel.c 制作静态库
    1.把源文件编译成.o文件 (二进制文件)
    gcc -o mathmodel.o -c mathmodel.c 
    2. 用归档工具ar归档为一个库文件 (lib库名.a)
    ar crv libmathmodel.a mathmodel.o
    3. 使用静态库编译程序
    gcc -o main main.c  -L.  -lmathmodel
     -L.  --后面添加库所在的路径(自动搜索的库路径) 
     -lmathmodel ---指定链接哪一个库(-l库名)
    如果是在当前路径下面,则是(L.)

    2.动态库:编译的时候不需要将所需的库文件一起编译进去,但是在程序运行的时候,当前环境下需要有这些库文件才能运行,编译生成的可执行文件就不会那么大。

      优点:1.程序升级方便。

         2.代码和数据共享。

         3.可以选择性的加载部分模块。

         4.节省空间和资源

     动态库制作:

    1.    编写源文件
    mathmodel.c
    2.    把源文件编译成二进制文件 mathmodel.o
    gcc -fPIC -o mathmodel.o -c mathmodel.c 
    3.    把.o文件打包成库
    gcc -fPIC -shared -o libmathmodel.so mathmodel.o
    4.    用动态库编译程序
    gcc -o main main.c -L. -lmathmodel
    5.    运行程序
    gec@ubuntu:/mnt/hgfs/05/code/shared$ ./main

    可能会出现的问题:

    ./main: error while loading shared libraries: libmathmodel.so: cannot open shared object file: No such file or directory

    解决问题--添加库环境变量(告诉系统到哪个目录下找这个库)

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD

    PS:如果有哪里写错了,请指正,大家互相学习一下之前这里还写了一点makefile的,但简单学习makefile之后,发现自己写的太烂了,就删了。

  • 相关阅读:
    LoadRunner如何监控Linux下的系统资源
    shareeverything and sharenothing原理区别
    LoadRunner下如何监控Windows系统资源
    简明 Vim 练级攻略
    自由地使用那10000个Web协议的License进行压力测试
    自己做的西直门桥
    Visual Studio问题解答(不断更新)
    记2012微软编程之美全国挑战赛
    matlab也能创作歌曲
    拈游戏
  • 原文地址:https://www.cnblogs.com/smallqizhang/p/12441164.html
Copyright © 2020-2023  润新知