我在Visual Studio 2005下编译了许多本机C++库(Win32,没有MFC),并在许多解决方案中使用.
我希望能够选择编译并将它们链接为静态库或DLL,具体取决于我正在使用它们的特定解决方案的需求.
最好的方法是什么?我考虑过这些方法:
示例:"foo_static.vcproj"vs"foo_dll.vcproj"
亲:很容易为新库生成,而不是过多的手动vcproj munging.
Con:两个地方的设置,文件列表等太容易失去同步.
示例:"Debug | Win32"vs"Debug DLL | Win32"等.
Pro:文件列表更容易保持同步; 编译选项更容易保持同步
Con:我为Win32和Smart Device目标构建,所以我已经有多个配置; 我不想让我的组合爆炸更糟("FooPhone的静态库| WinMobile 6","FooPhone的动态库| WinMobile 6","BarPda的静态库| WinMobile 6"等.
更糟糕的是:VS 2005有一个坏习惯,假设你有一个为平台"Foo"定义的配置,那么你真的需要它适用于你的解决方案中的所有其他平台,并且随意地插入所有配置/平台配置的所有排列受影响的vcproj文件,无论是否有效.(向MS提交的Bug;作为WONTFIX关闭.)
示例:将相应的vcproj片段存储在属性表文件中,然后在需要静态库时将"FooApp静态库"属性表应用于配置/平台组合,并在需要DLL时应用"FooApp DLL"属性表.
优点:这就是我真正想要做的!
缺点:似乎不可能. 似乎静态和动态库之间切换的.vcproj属性(Configuration元素的ConfigurationType属性)不能被.vsprops文件覆盖.Microsoft针对这些文件发布的架构仅列出
编辑:如果有人建议,我也尝试了一个更"聪明"的#3版本,其中我定义了一个包含名为"ModuleConfigurationType"的UserMacro的.vsprops,其值为"2"(DLL)或" 4"(静态库),并更改了.vcproj中的配置ConfigurationType="$(ModuleConfigurationType)"
.Visual Studio以静默方式无需警告即可删除该属性并替换为该属性ConfigurationType="1"
.太有帮助了!
我错过了更好的解决方案吗?
我可能错过了一些东西,但为什么你不能在没有文件的情况下定义DLL项目,只是将它链接到另一个项目创建的lib?而且,关于设置,您可以将它们分解为vsprop文件...
有一种简单的方法可以在一个项目中创建static和dll lib版本.
创建你的DLL项目.然后执行以下操作:
只需创建一个运行lib工具的nmake makefile或.bat文件.基本上,这就是这个:
lib /NOLOGO /OUT:@<< <<
然后,在您的项目中,添加一个Post Build Event,其中命令只运行.bat文件(或nmake或perl).然后,您将始终获得dll和静态库.我将避免诋毁visual studio,因为它不允许在Linker之前的项目中存在这个工具(在工具流程中).