可能由于实际工作的需要,有时需要将多个lib合并成一个lib, 以方便使用。
有两种方式来实现这个合并工作:
1、使用VSIDE:
1.1 建立一个最终的lib工程(当然也可以用最上层的工程),在Project\Property\Configuration Properties\Librarian\General\Additional Dependencies 中,加入要进行合并到当前Lib中的*.lib即可。
有人说还要将Link Library Dependencies 设置为Yes,其实是不必要的。这个是解决依赖的库自动加进来的,我们一般不使用。
1.2 由于我们的lib有可能使用了#pragma comment(lib, "test.lib") 这样的link 指令,就导致了有一点小麻烦:
1.2.1 如果有,那么要在使用这个合并了的库工程设置中,忽略掉默认库才行,即将:Project\Property\Configuration Properties\Linker\Input\Ignore All Default Libraries 为 NO,同时,要将需要的运行时库加入到Additional Dependencies中即可。
1.2.2 如果没有,那么加入这个合并了的库即可使用。
2、也可使用 lib.exe 命令来进行合并:
2.1 方法1:
命令如下:lib.exe lib1.lib lib2.lib ... /out:hw.lib
2.2 另一种合并的方法:
思路:lib.exe 可以把lib文件里的obj文件取出来,然后把这些obj文件重新合并成一个lib文件即可。
步骤如下:
列出lib文件中的obj文件
lib lib1.lib /list
lib lib2.lib /list
提取出obj文件,大小写一定要和上一步列出的一致
lib lib1.lib /extract:.\Debug\lib1.obj /out:lib1.obj
lib lib2.lib /extract:.\Debug\lib2.obj /out:lib2.obj
合并obj文件到新的lib
lib lib1.obj lib2.obj /out:hw.lib
警告没有了,并且另外一个副作用是生成的lib文件比前一种方法小多了。
3. 如何知道有没有使用#pragma comment(lib, "test.lib") 这样的指令呢?可以使用命令:dumpbin /directives xlib_no_LibAB.lib, 则可以看到用户的库和其它运行时库,如下示例:
D:\Workplace\VS2008\LibAB\Debug>dumpbin /directives xlib_no_LibAB.lib
Dump of file xlib_no_LibAB.lib
File Type: LIBRARY
Linker Directives
-----------------
/DEFAULTLIB:"MSVCRTD"
/DEFAULTLIB:"OLDNAMES"
/EDITANDCONTINUE
Linker Directives
-----------------
/DEFAULTLIB:"MSVCRTD"
/DEFAULTLIB:"OLDNAMES"
/EDITANDCONTINUE
Linker Directives
-----------------
/DEFAULTLIB:"liba"
/DEFAULTLIB:"libb"
/DEFAULTLIB:"MSVCRTD"
/DEFAULTLIB:"OLDNAMES"
/EDITANDCONTINUE
Summary
2ED4 .debug$S
D0 .debug$T
E9 .drectve
C .rtc$IMZ
C .rtc$TMZ
B4 .text
这儿的默认运行时库就是:"MSVCRTD" "OLDNAMES"
而用指令连接的用户库是:"liba" "libb"