c++ 静态库,动态库的制作和使用

目录

静态库动态库概念

优缺点对比

制作静态库及使用

制作动态库(共享库)及使用


静态库动态库概念

静态库:链接时,静态库代码被打包到可执行程序里

动态库:链接时,动态库代码不会被打包到可执行程序里,只会打包名字等库信息。启动时,动态库会被动态加载到内存中,通过ldd(list dynamic dependencied) 命令可以检查动态库依赖关系。

优缺点对比:

静态库:

 动态库:

制作静态库

        gcc -c test.cpp 生成.o目标文件                         

        ar rcs libxxx.a xxx.o xxx.o 打包文件制作静态库 libxxx.a    (windows libxxx.lib)  

使用静态库   

        g++ main.cpp -o app -ltest -L ./ -I ./

        注意 制作的静态库目录在哪里

        -L 后便要指定静态库目录,否则 系统会去默认路径查找 

        (-I ./) 指明.h文件目录。

制作动态库(共享库)

        gcc -c -fpic/-fPIC test.cpp 生成.o 目标文件 (是一个和位置无关的代码)

        -fpic  ( pic:position independent code位置无关码)用于编译阶段,产生的代码没有绝对地址,全部用相对地址,满足了共享库的要求,共享库被加载时地址不是固定的。

        如果不加-fpic ,那么生成的代码就会与位置有关,当进程使用该.so文件时都需要重定位,且会产生成该文件的副本,每个副本都不同,不同点取决于该文件代码段与数据段所映射内存的位置。

        gcc -shared -o xxx.o xxx.o libxxx.so 打包文件制作动态库 libxxx.so    (windows libxxx.dll)

使用动态库

         g++ main.cpp -o app -lcalc -L ./    编译可执行文件名为 app  

        此时./app运行出错  加载失败 

        ldd app 列出app依赖动态库 ,发现 libcalc.so not found

               

         --->如何定位动态库文件  : 用系统动态载入器(ld-linux.so,专门用来负责定位、加载程序所需要的所有动态库文件)获取绝对路径。

        1) export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/nowcoder/projects/linuxtest

将当前目录加进ld_library_path。此时ldd app 可以找到该动态库。 但是临时有效。

        2)永久有效

         用户级

cd /home
vim ~/.bashrc
//进入.bashrc隐藏文件,底端输入 
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/nowcoder/projects/linuxtest
 
退出后 . ~/.bashrc 使生效

           此时,即使重新打开终端,也可以./app直接运行。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值