C++:静态库如何合并

本文详细介绍了在Windows和Linux环境下合并静态库和动态库的方法,包括使用Visual Studio的图形界面和命令行工具lib.exe、dumpbin,在Linux下使用ar命令。同时,文章提供了查看库文件中函数的技巧,如dumpbin和objdump命令的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、Windows库文件的合并

1、静态库合并

2、库中函数的查看方式

二、Linux库文件的合并

1、静态库合并

2、库中函数的查看方式


一、Windows库文件的合并

1、静态库合并

a、通用的方法是:
Additional Dependencies:添加需要合并的*.lib文件
Additional Library Directories:添加需要合并的*.lib文件的路径

如果多个工程有依赖关系,据说可以设置Link Library Dependencies,但我在VS2017中并没有试成功。具体可参考如下文档:Flexible Project-to-Project References

实际上这种方式的本质是在link后,添加*.lib文件的路径作为参数。

b、使用命令

lib.exe /out:objectlib.lib lib1.lib lib2.lib

以上运行结果就是将lib1.lib、lib2.lib合并到objectlib.lib

lib命令的参数如下:

C:>lib /?
usage: LIB [options] [files]

   options:

      /DEF[:filename]
      /ERRORREPORT:{NONE|PROMPT|QUEUE|SEND}
      /EXPORT:symbol
      /EXTRACT:membername
      /INCLUDE:symbol
      /LIBPATH:dir
      /LIST[:filename]
      /LTCG
      /MACHINE:{ARM|ARM64|EBC|X64|X86}
      /NAME:filename
      /NODEFAULTLIB[:library]
      /NOLOGO
      /OUT:filename
      /REMOVE:membername
      /SUBSYSTEM:{BOOT_APPLICATION|CONSOLE|EFI_APPLICATION|
                  EFI_BOOT_SERVICE_DRIVER|EFI_ROM|EFI_RUNTIME_DRIVER|
                  NATIVE|POSIX|WINDOWS|WINDOWSCE}[,#[.##]]
      /VERBOSE
      /WX[:NO]

2、库中函数的查看方式

静态库:

dumpbin   /LINKERMEMBER   test.lib   >   out.txt

动态库:

dumpbin /exports  test.dll  > out.txt

dumpbin命令的参数如下:

C:>dumpbin /?
usage: DUMPBIN [options] [files]

   options:

      /ALL
      /ARCHIVEMEMBERS
      /CLRHEADER
      /DEPENDENTS
      /DIRECTIVES
      /DISASM[:{BYTES|NOBYTES}]
      /ERRORREPORT:{NONE|PROMPT|QUEUE|SEND}
      /EXPORTS
      /FPO
      /HEADERS
      /IMPORTS[:filename]
      /LINENUMBERS
      /LINKERMEMBER[:{1|2}]
      /LOADCONFIG
      /NOLOGO
      /OUT:filename
      /PDATA
      /PDBPATH[:VERBOSE]
      /RANGE:vaMin[,vaMax]
      /RAWDATA[:{NONE|1|2|4|8}[,#]]
      /RELOCATIONS
      /SECTION:name
      /SUMMARY
      /SYMBOLS
      /TLS
      /UNWINDINFO

二、Linux库文件的合并

1、静态库合并

a、如果都是*.o文件:

ar rc libtest.a *.o      // 将当前目录下所有.o文件合并到libtest.a
ranlib libtest.a          // 对静态库的符号索引表进行更新

b、如果都是*.a文件:

ar x /usr/local/libA/A.a
ar x /usr/local/libB/B.a
ar x /usr/local/libC/C.a
ar cru libABC.a /usr/local/libA/*.o /usr/local/libB/*.o /usr/local/libC/*.o
ranlib libABC.a

ar命令的其它参数如下:

$ ar --help
用法:ar [仿真选项] [-]{dmpqrstx}[abcDfilMNoPsSTuvV] [--plugin <名称>] [成员名] [计数] 归档 文件…
       ar -M [<mri-脚本]
 命令:
  d            - 从归档文件中删除文件
  m[ab]        - 在归档文件中移动文件
  p            - 打印在归档文件中找到的文件
  q[f]         - 将文件快速追加到归档文件中
  r[ab][f][u]  - 替换归档文件中已有的文件或加入新文件
  s            - 作为 ranlib 工作
  t            - 显示归档文件的内容
  x[o]         - 从归档文件中分解文件
 特定命令修饰符:
  [a]          - 将文件置于 [成员名] 之后
  [b]          - 将文件置于 [成员名] 之前 (于 [i] 相同)
  [D]          - 将 0 用于时间戳和 uid/gid
  [D]          - 使用实际时间戳和 uid/gid(默认)
  [N]          - 使用名称的实例 [数量]
  [f]          - 截去插入的文件名称
  [P]          - 在匹配时使用完整的路径名
  [o]          - 保留原来的日期
  [u]          - 只替换比当前归档内容更新的文件
 通用修饰符:
  [c]          - 不在必须创建库的时候给出警告
  [s]          - 创建归档索引 (cf. ranlib)
  [S]          - 不要创建符号表
  [T]          - 产生一个简单归档
  [v]          - 输出较多信息
  [V]          - 显示版本号
 @<file>       - 从 <file> 读取选项

2、库中函数的查看方式

查看依赖项:

objdump -x xxx.so | grep "NEEDED"

查看动态符号表:

objdump -T xxx.so

查看符号表:

objdump -t xxx.so

 

参考文档
使用objdump查看动态库和静态库中具有哪些函数
windows下多个静态库合并的方法
Flexible Project-to-Project References

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值