zoukankan      html  css  js  c++  java
  • Linux学习笔记7——linux中的静态库和动态库

    一、静态库的编译

      静态库的编译过程如下:

      1、编译成目标文件

        这里有一个可选项-static,调用格式:gcc -c -static 代码文件名.c

      2、归档成静态库

        A、归档的工具是ar工具,使用ar -r可以将文件归档成静态库,调用格式:ar -r 静态库文件 被归档的文件

          例如:我们这有两个C文件,分别为test1.c和test2.c

            首先我们将它编译成目标文件:gcc -c -static test1.c

                          gcc -c -static test2.c

            此时会产生两个文件,分别为test1.o和test2.o

            然后我们将它们归档:ar -r libdemo1.a test1.o test2.o,此时的静态库文件就是demo1.a。注意demo1是库名,前面加上lib是命名规范。

        B、使用nm工具可以查看已有函数符号表,使用格式为:nm 静态库或者动态库或者目标文件或者执行文件

      3、使用静态库

        使用格式:gcc 代码文件名.c   l静态库名 -L库所在目录

        例如:这里有一个main.c文件和上面的libdemo1.a静态库,现在我们想编译它,则:

          gcc main.c -omain -ldemo1 -L.

          

      4、静态库的规范和约定

        库命名规则:lib库名.a            //此处是指在lib后面直接加上库名,如上例中的libdemo1.a

        库使用规则:-l库名            //此处是指在-l后面直接加上库名

              -L库所在目录          //此处是指在-L后面直接加上库所在目录,如在当前目录,就是-L.

      5、采用库的方式管理代码优点:容易组织代码、复用、保护代码版权

      6、静态库的静态的含义:编译好的程序运行的时候不依赖库,库作为程序的一部分编译连接。

      7、静态库本质:就是目标文件集合(归档)

    二、动态库的编译(Linux中称为共享库)

      1、动态库和静态库的区别

        A、动态库是可以执行,静态库不能执行。

        B、动态库不会成为程序的一部分,而静态库在程序的链接阶段被复制到了程序中

      2、动态库的编译

        使用-c -fpic,其中-fpic可选

      3、动态库的连接

        使用-shared

        例如:有两个C文件,分别为test3.c,test4.c

          分别对他们进行编译:gcc -c -fpic test3.c

                    gcc -c -fpic test4.c

          产生test3.o和test4.o,然后对他们连接:gcc -shared -olibdemo2.so test3.o test4.o

      4、使用动态库

        使用格式:gcc 代码   -l库名 -L动态库所在路径

        例如:有一个代码文件main2.c,要使用上面产生的动态库demo2,则:

            gcc main2.c -ldemo2 -L. -omain

      5、动态库的命名规则

        lib库名.so

      6、动态库的加载

        A.找到动态库
             B.加载动态库到内存
             C.映射到用户的内存空间

      7、系统对动态库查找规则

         A、在/lib中查找
            B、在/usr/lib中查找
            C、到环境变量LD_LIBRARY_PATH指定的路径中查找

      8、动态库的使用工具

        ldd  察看程序需要调用的动态库,当然,ldd只能查看可执行文件

        readelf -h 查看执行程序头.

        

      

        

            

  • 相关阅读:
    闭包
    TCL
    [Go] gin框架渲染html字符串
    [Go] 使用packr包把静态文件打包进二进制内
    [javascript] 获取正则子表达式里的内容
    [redis] Zremrangebylex命令移除元素令人困惑不能理解
    [Go] 获取文件夹下面指定模式的文件列表 , 并且获取文件创建时间删除超过30分钟的文件
    [vuejs] 聊天框在overflow:auto中填数据时滚动到底部
    [vuejs] 在vuejs中使用websocket进行实时通讯
    Egret顶级开发者—李昌平
  • 原文地址:https://www.cnblogs.com/zjzsky/p/3465960.html
Copyright © 2011-2022 走看看