目录
一、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