关于VC静态库的合并

可能由于实际工作的需要,有时需要将多个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"

你可能感兴趣的:(关于VC静态库的合并)