我有许多在 Visual Studio 2005 下编译的本机 C++ 库(Win32,没有 MFC),并在许多解决方案中使用。
我希望能够选择将它们编译和链接为静态库或 DLL,具体取决于我使用它们的特定解决方案的需要。
最好的方法是什么?我考虑过这些方法:
1.多个项目文件
- 示例:“foo_static.vcproj”与“foo_dll.vcproj”
- 优点:易于为新库生成,不需要太多手动 vcproj 修改。
- 缺点:两个地方的设置、文件列表等太容易不同步。
2.单个项目文件,多种配置
- 示例:“调试 | Win32”与“调试 DLL | Win32”等。
- 优点:文件列表更容易保持同步;编译选项更容易保持同步
- 缺点:我为 Win32 和智能设备目标构建,所以我已经有多种配置;我不想让我的组合爆炸变得更糟(“FooPhone 的静态库 | WinMobile 6”、“FooPhone 的动态库 | WinMobile 6”、“BarPda 的静态库 | WinMobile 6”等。
- 更糟糕的骗局:VS 2005 有一个坏习惯,即假设如果您为平台“Foo”定义了配置,那么您的解决方案中的所有其他平台确实需要它,并且随意插入所有配置/平台配置的排列受影响的 vcproj 文件,无论是否有效。(向 MS 提交的错误;作为 WONTFIX 关闭。)
3.单个项目文件,通过vsprops文件选择静态或动态
- 示例:将适当的 vcproj 片段存储在属性表文件中,然后在需要静态库时将“FooApp 静态库”属性表应用于配置/平台组合,并在需要 DLL 时应用“FooApp DLL”属性表。
- 优点:这是我真正想做的!
- 缺点:这似乎不可能。 .vsprops 文件似乎无法覆盖在静态库和动态库之间切换的 .vcproj 属性(Configuration 元素的 ConfigurationType 属性)。Microsoft 为这些文件发布的架构仅列出 <Tool> 和 <UserMacro> 元素。
编辑:如果有人建议,我还尝试了#3 的更“聪明”版本,其中我定义了一个 .vsprops,其中包含一个名为“ModuleConfigurationType”的 UserMacro,其值为“2”(DLL)或“ 4"(静态库),并将 .vcproj 中的配置更改为具有ConfigurationType="$(ModuleConfigurationType)"
. Visual Studio 无提示地删除该属性并将其替换为ConfigurationType="1"
. 太有帮助了!
我错过了更好的解决方案吗?