【Linux】静态库和动态库

    一、静态库:在编译链接时,将库内容直接合并到最终的可执行文件中;是中间文件的集合;静态库是在程序当中的;静态库最终执行时不依赖与库文件(即就是在加载的时候已经将静态库拷贝到程序中,就算删除静态库后也对程序的执行没有影响)。

    二、动态库: 在链接阶段仅仅是将使用哪个共享库设置到最终的可执行文件,在程序运行时,才会加载动态库;是不可执行(不可单独执行)的可执行文件;动态库是不在程序当中的,执行时会将动态库单独加载到内存中;

   三、各自的优缺点:

    对于静态库,编译完成之后,库文件的作用就不大了,也就是生成的目标程序没有了外部依赖,可以直接运行;但相应的会使得目标程序的体积增大;对于动态库,不需要将其拷贝到目标程序中,这就不会影响目标程序的体积,并且同一份动态库可以被多个车鞥徐同时使用。由于动态库是编译时才加载到内存中,我们就可以随时对库进行替换,而不需要重新编译代码。当然,动态库的动态载入会带来一部分性能损失,使用动态库也会使得程序依赖于外部环境。如果环境缺少或者库的版本不正确,就会产生程序崩溃的问题。

    四、库文件:某些功能代码的集合;不允许有main函数

     Windows上静态库是.lib,动态库是.dll;

    Linux上静态库是.a,动态库是.so.

    1.1生成静态库:将所有的.c文件生成.o文件,除main函数

           1)gcc -c *.c -à *.o文件

           2)ar crv libxxx.a  *.o--àlibxxx.a 将目标文件归档

   1.2使用静态库:main.c

           方式一:Gcc -o main main.c -L(库的路径) -l(库的名称)

           方式二:gcc -o main main.c 路径/libxxxx.a

  2.1生成动态库:

           Gcc -shared -fPIC -o libxxx.so *.c

  2.2使用动态库:

           方式一:Gcc -o main main.c -L(库的路径) -l(库的名称)

           方式二:gcc -o main main.c 路径/libxxxx.so

3.1  Linux操作系统加载动态库的路径:默认/lib和/user/lib;

          方式一:将自己生成的动态库拷贝到/lib或者/user/lib下;但是只有root用户有权限进入;

           方式二:设置环境变量,使操作系统加载库时除了在默认路径下搜索,还需要到用户指定的路径下搜索;

          可以在用户目录下创建/lib目录,将自己所写的所有动态库放在该目录下(/home/stu/lib),设置环境变量exeorp LD_LIBRARY_PATH = /home/lib;

           exeorp LD_LIBRARY_PATH = 绝对路径;仅仅只对当前终端有效;使环境变量永久有效,修改配置文件/home/user/bashrc,添加所要改变的环境变量;

           命令:ldd+可执行文件    显示所有的共享库;

                        echo+环境变量     查看环境变量;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值