C++静态库、动态库、常用库命令

本文详细介绍了C++中的静态库(.a)和动态库(.so/dll)的区别,包括链接时机、空间效率、创建过程和使用方法。涵盖了静态库的命名规则、创建与使用,以及动态库的链接载入特性、命名规则和创建。还提供了相关命令和实践技巧,如g++选项和nm, ldd命令的使用。
摘要由CSDN通过智能技术生成

c++静态库动态库

1. 库的概念

库本质上是一种可执行代码的二进制形式,可以被操作系统载入内存执行。
静态库:(.a, .lib) 在链接阶段,将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。可以简单看成是一组目标文件(.o/ .obj文件)的集合,很多目标文件经过压缩打包后形成的一个文件
动态库:(.so, .dll)
静态库和动态库指的是链接方式不同

预编译->编译->汇编->链接->可执行文件

2. 静态库

  1. 静态库对函数库的链接是放在编译时期完成的
  2. 程序运行时与函数库无关,移植方便
  3. 浪费空间和资源,因为所有的目标文件与牵涉到的函数库被链接合成一个可执行文件

2.1 静态库命名规则
命名规范:lib[your_library_name].a
lib: 前缀
your_library_name: 静态库名
.a: 扩展名

2.2 创建静态库(.a)
讲代码编译编译成目标文件 .o —> 通过ar工具将目标文件打包成为.a 静态库文件 (生成.a)

g++ -c StaticMath.cpp
// 需要带参数-c,否则直接编译为可执行文件
ar -crv libstaticmath.a StaticMath.o

2.3 使用静态库
需要在编译的时候,指定静态库的搜索路径(-L),指定静态库名(不需要lib[].a格式,-l选项)
-L: 指定要链接的库所在的目录
-l: 指定链接时需要的动态库,编译器查找动态库有命名规则,在名字前面加上lib,后面加上.a或.so来确定库的名称

g++ TestStaticLibrary.cpp -L../staticLibrary -lstaticmath

3. 动态库

静态库的特点:1.存在空间浪费;2.静态库对于程序的更新、部署和发布带来麻烦。
!
在这里插入图片描述

动态库在程序编译时不会被连接到目标代码中,在程序运行时候才被载入。
动态库在内存中只会拷贝一份,避免静态库存在浪费空间的问题。不同的应用程序调用相同的库,在内存里只需要一份该共享库的实例。
特点:

  1. 对库函数的链接载入推迟到程序运行的时期
  2. 进程之间可以实现资源共享

动态库不需要打包工具,直接使用编译器就可以创建动态库
3.1 动态库命名规则
名字形式为 libxxx.so
lib为前缀,.so为后缀

  • 对于实际库文件,每个共享库都有特殊的名字"soname",在程序启动之后,通过名字告诉动态加载器应该载入哪个共享库
  • 在文件系统中,soname是一个链接到实际动态库的链接,每个库都有一个另一个名字给编译器。他是一个指向实际库镜像文件的链接文件(lib+soname+.so)

3.2 创建动态库(.so)
生成目标文件 --> 生成动态库

g++ -fPIC -c DynamicMath.cpp
// -fPIC创建与地址无关的编译程序(pic, position independent code),使得能够在多个应用程序之间共享
g++ -shared -o libdynmath.so DynamicMath.o
// -shared指定生成动态链接库

也可以使用

g++ -fPIC -shared -o libdynmath.so DynamicMath.cpp

3.3 使用动态库
使用方式和静态库一样, -L, -l

当报错error while loading shared libraries…
如何定位共享库的位置?
当系统加载可执行代码的时候,能够知道所依赖的库名字,但是也需要知道绝对路径。需要动态载入器,对于elf(g++编译格式为此)格式的可执行程序,是由ld -linux.so*完成的,它会先后搜索elf文件DT_RPATH段环境变量LD_LIBRARY_PATH–/etc/ld/so.cache文件列表 —/lib/, /usr/lib 目录找到库文件后将其载入内存

  • 如果安装在/lib, /usr/lib下,ld默认能够找到
  • 如果安装在其他目录,需要添加至/etc/ld/so.cache文件中,步骤如下
    • 编辑/etc/ld.so/conf,加入库文件所在目录的路径
    • 运行ldconfig,(重建/etc/ld/so.cache文件)

4. 库相关命令

4.1 g++编译选项

-shared:指定生成动态链接库
-static:指定生成静态链接库
-fPIC:编译为独立位置的代码,用于编译共享库
-L: 表示连接的库所在的目录
-l: 指定连接时候需要的动态库
-Wall: 生成所有告警信息
-g: 编译器在编译的时候产生调试信息
-c: 把程序生成目标文件

4.2 nm命令

nm可以打印出库中涉及到的所有符号

nm libhello.h

4.2 ldd命令

可以查看一个可执行程序依赖的共享库

ldd libdynmath.so

参考教程:https://www.runoob.com/w3cnote/cpp-static-library-and-dynamic-library.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值