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 查看执行程序头.

        

      

        

            

  • 相关阅读:
    January 25th, 2018 Week 04th Thursday
    January 24th, 2018 Week 04th Wednesday
    January 23rd, 2018 Week 04th Tuesday
    January 22nd, 2018 Week 04th Monday
    January 21st, 2018 Week 3rd Sunday
    January 20th, 2018 Week 3rd Saturday
    January 19th, 2018 Week 3rd Friday
    January 18th, 2018 Week 03rd Thursday
    January 17th, 2018 Week 03rd Wednesday
    January 16th, 2018 Week 03rd Tuesday
  • 原文地址:https://www.cnblogs.com/zjzsky/p/3465960.html
Copyright © 2011-2022 走看看