静态库动态库——Linux

 

目录

前言

静态库

    生成静态库

动态库

    生成动态库

使用库


前言

    库文件就是将已经实现的代码打包,生成的不是可执行程序,而是个别人提供的接口。

静态库

    静态链接:生成可执行文件时链接静态库,直接将库中所用的函数实现,拿到可执行程序中,不存在运行依赖,效率高,但是生成的可执行文件较大,如果运行多个用到同一个静态库的程序则会出现代码在内存中有大量冗余。

    生成静态库

        1.先把所有的原码进行编译汇编生成各自的二进制指令:

           例如: gcc add.c -o add.o

           但这样写在linux下编译时会报错

          问题在于以上代码中没有main函数,但是编译器认为我的程序为可执行的程序,修改方法添加“-c”,表示不去链接为可执行程序,只需编译为.o文件

       

         可以看到加了 -c后就成功了,目录下多了一个add.o文件

        2.把所有生成的二进制文件打包在一起

            例如:ar -cr libmyadd.a add.o

              上面的libmyadd.a是生成的库, .a是静态库后缀

 

动态库

    动态链接:生成可执行程序时链接动态库,记录库中的符号表,生成的程序小,多个程序运行时可以共享使用同一个动态库,运行时会依赖动态库的存在(运行程序时才会将动态库加载到内存中)。

    生成动态库

        步骤和上面一样

        1.   gcc -FPIC -c add.c -o add.o

           -FPIC是在编译生成指令时,产生与位置无关的代码

         为了和静态库区别,使用了add2,可以看到生成成功了

        2.  gcc --shared add.o -o add.so

           .so是动态库后缀

         生成成功了

使用库

    使用-l 来告诉编译器要使用哪个库

        例如 : gcc main.c -o main -llibmyadd.a

    但是会报错

    因为编译器会回到指定目录下(/usr/lib64)查找这个文件

    所以解决方法:

    1.将库文件放到指定路径下:64位系统——/usr/lib64  ;32位:——/usr/lib

    2.设置环境变量:

    export LIBRARY_PATH=${LIBRARY_PATH}../   将库文件所在目录添加到环境变量中

    export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}../  添加运行加载库文件路径

注意:动态库与静态库同时存在时,gcc优先链接动态库。

    3.使用gcc -L 选项,指定库文件所在路径: gcc main .c -o main -L./ -llibmyadd.a

        使用这种方式只适用于在指定路径下,链接静态库后,因为无法设置运行程序时的库加载路径。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值