linux库的制作--静态库、动态库(共享库)

目录

一、什么是库?

二、库的分类    

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

四、库的意义

五、静态库 

1、特点:

2、如何创建静态库

六、动态库(共享库)

1、特点:

2、如何制作动态库


一、什么是库?


        本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。由于windows和
        linux的本质不同,因此二者库的二进制是不兼容的。


二、库的分类    


        linux下的库有两种:静态库和共享库(动态库)。二者的不同点在于代码被载入的时刻不同。

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

         静态库:1>在程序编译时会被连接到目标代码中,
                2>程序运行时将不再需要该静态库
                3>因此体积较大。

        动态库:1>在程序编译时并不会被连接到目标代码中
                2>而是在程序运行时才被载入,因此在程序运行时还需要动态库存在
                3>因此代码体积较小。
                4>不同的应用程序如果调用相同的库,在内存里面有一个库就行
                

四、库的意义


        库是别人写好的现有的,成熟的,可以复用的代码,你可以使用但要记得遵守
        许可协议。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开
        始,因此库的存在意义非同寻常。
    
        共享库的好处是,不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。
        
            1>尊重开发者的知识产权
            2>对源代码进行屏蔽

五、静态库 

1、特点:

                 静态库对函数库的链接是放在编译时期(compile time)完成的。
                gcc分四个步骤:预处理----编译---汇编---链接
                    hello.c----hello.i--hello.s-hello.o-hello(a.out) 
                
                优点:程序在运行时与函数库再无瓜葛,移植方便

                缺点:浪费空间和资源,因为所有相关的对象文件(object file)与牵涉到的函数
                库(library)被链接合成一个可执行文件(executable file)。

2、如何创建静态库

                1>创建一个库源文件:mylib.c    和.h文件
                    int myplus(int a,int b){ 
                        return a+b;
    
                    }
                    int myusb(int a,int b){ 
                        return a-b;
                    }
                2>将库源文件编译成.0的目标文件
                gcc -c mylib.c -o mylib.o
                
                3>将.o文件制作成静态库文件------///静态库的名字必须如:lib库名.a
                ar crs libmylib.a mylib.o

                4>编写一个测试代码:test.c
                #include <stdio.h>
                #include "mylib.h"

                int main(void)
                {
                    int a,b;
                    printf("请输入a和b:");
                    scanf("%d%d",&a,&b);

                printf("%d + %d=%d\n",a,b,myplus(a,b));
                printf("%d - %d=%d\n",a,b,myusb(a,b));   
                return 0;
                }

                
                
                5>编译test.c的同时链接我们制作的静态库
                gcc -Wall -o test1 test.c -L. -lmylib
                    -L:库的路径
                    -l:库名

六、动态库(共享库)

1、特点:

                动态库把对一些库函数的链接载入推迟到程序运行的时期(runtime)。可以实现进程之间的资源共享。
                    将一些程序升级变得简单。
                    甚至可以真正做到链接载入完全由程序员在程序代码中控制。

2、如何制作动态库

                //动态库的命令形式为:libxxx.so,后缀为.so
                    1>创建一个库源文件:mylib.c    和.h文件
                    int myplus(int a,int b){ 
                        return a+b;
    
                    }
                    int myusb(int a,int b){ 
                        return a-b;
                    }
                    2>将库源文件编译成.o的目标文件
                    gcc -fPIC -Wall -c mylib.c
                    fPIC:创建与地址无关的编译程序
                    
                    3>将.o文件制作成动态库文件
                    gcc -shared -fPIC -o libmylib.so mylib.o
                    
                    4>编写测试文件:test.c
                    
                    
                    5>编译test.c的同时链接我们制作的动态库
                        gcc -Wall -o test test.c -L. -lmylib

                    6>将动态库加载进系统当中---如何让系统找到它
                            三个方法
                            
                            :方法1:
                                直接将动态库文件拷贝到/lib或者usr/lib
                                
                            
                            方法2:
                                将动态库所在的路径加入到配置文件中:/etc/ld.so.conf的后面,如下
                                        sudo vim /etc/ld.so.conf    打开配置文件
                                        
                                        在下面一行添加:
                                        /home/farsight/shared/IO/day3/autolib/

                                    保存退出后,执行:sudo ldconfig
                                
                            方法3:
                                    将动态库所在路径加入到环境变量中:LD_LIBRARY_PATH
                                    
                                    执行命令:
                            export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/farsight/shared/IO/day3/autolib

                            7>执行:test


                            8>给动态库升个级
                            #include <stdio.h>
                            int myplus(int a,int b){ 
                                printf("level up\n");
                                return a+b;

    
                            }
                            int myusb(int a,int b){ 
                            printf("level up\n");
                            return a-b;
                            }

                            
                            
                            9>重新制作动态库
                                gcc -fPIC -Wall -c mylib.c
                                gcc -shared -fPIC -o libmylib.so mylib.o
                                
                            10>再次执行:test
                                请输入a和b:1 3
                                level up
                                1 + 3=4
                                level up
                                1 - 3=-2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值