大规模C++开发中,经常需要将一个解决方案(sln)分成若干个项目(vcproj)来做,以实现对解决方案的有效管理。如果用很多个静态库项目(lib)来支撑一个或几个主项目(exe)时,就会发现“链接器/附加依赖项”的配置会变得非常复杂。
通过“框架和引用”设置可以在很大程度上解决该问题,作者在实际项目中多采用此法,比手工配置“链接器/附加依赖项”、设置项目依赖项、调整项目生成顺序少了很多麻烦。当然此法仅对于有源码并能正常创建项目并假如解决方案的情况比较有效。
那么对于没有源码的项目,有没有方法将若干个静态库lib文件合并成一个?这样链接时的配置就方便很多。VC自带的生成工具里有一个lib.exe的库管理器,可以方便的实现lib文件的合并。指令 lib /out:lib_all.lib lib1.lib lib2.lib 就可以方便的将lib文件合并,具体用法请详细阅读lib的帮助文档。lib.exe可以在控制台手工执行,也可以将其作为项目的命令配入自动执行,写个bat脚本也行。
另外也可以直接在IDE中通过选项配置,直接通过lib完成库合并工作。MSDN中对此的解释比较简略:
在 Visual Studio 开发环境中设置 LIB.EXE 选项
- 访问项目的属性页对话框。
- 在静态库项目为活动时,选择“管理员”文件夹。
- 选择“常规”或“输入/输出”属性页。
- 根据需要修改属性。
其中第4条一笔带过,有点含糊。实际操作中,可以建立一个将多个lib合并起来的容器性质的项目。在“管理员/常规”选项卡“附加依赖项”中填写要合并的lib库名称,在“附加库目录”中写明库的查找路径,并确保“链接库依赖项”为“是”。这样rebuild该包装项目后,会在输出目录看到合并后的lib。其他exe或者dll只要链接该lib就可以了,不用再去链那一堆堆的小lib,烦人。但最好不要删掉该项目中所有的C++文件(比如默认生成的预编译头之类的),否则会在最终的exe或dll链接时发现有一个稍稍不爽的LNK4099出现。当然同时那些原来lib项目的pdb文件无法被正常链接进来,pdb调试符号表的残缺可能对调试是有负面影响的。
参考:
多项目解决方案的一些基本知识可以参考《作为容器的解决方案》
《Visual C++ 技巧:如何合并多个静态库(*.lib)》
2010-04-14
多个非托管dll的合并可以参考:
任明汉写的《合并DLL》
多个托管dll的合并可以参考:
微软官方的ILMerge,目前已经做的比较成熟了
ILMerge is a utility for merging multiple .NET assemblies into a single .NET assembly. It works on executables and DLLs alike and comes with several options for controlling the processing and format of the output. See the accompanying documentation for details.
http://blog.joycode.com/mvm/archive/2004/03/02/14487.joy
http://www.cnblogs.com/margiex/archive/2008/06/24/302329.html
评论