从同一个项目构建DLL和静态库

时间:2008-12-17 22:34:43

标签: c++ winapi visual-studio-2005 projects-and-solutions vsprops

我在Visual Studio 2005下编译了许多本机C ++库(Win32,没有MFC),并在许多解决方案中使用。

我希望能够选择编译并将它们链接为静态库或DLL,具体取决于我正在使用它们的特定解决方案的需求。

最好的方法是什么?我考虑过这些方法:

1。多个项目文件

  • 示例:“foo_static.vcproj”vs“foo_dll.vcproj”
  • Pro:很容易为新库生成,而不是过多的手动vcproj munging。
  • Con:两个地方的设置,文件列表等太容易失去同步。

2。单个项目文件,多个配置

  • 示例:“Debug | Win32”vs“Debug DLL | Win32”等
  • Pro:文件列表更容易保持同步;编译选项更容易保持同步
  • Con:我为Win32和Smart Device目标构建,所以我已经有多个配置;我不想让我的组合爆炸变得更糟(“FooPhone的静态库| WinMobile 6”,“FooPhone的动态库| WinMobile 6”,“BarPda的静态库| WinMobile 6”等。
  • 更糟糕的Con:VS 2005有一个坏习惯,假设你有一个为平台“Foo”定义的配置,那么你真的需要它适用于你的解决方案中的所有其他平台,并随意插入所有配置/平台配置的排列遍布受影响的vcproj文件,无论是否有效。 (向MS提交的Bug;作为WONTFIX关闭。)

3。单个项目文件,通过vsprops文件选择静态或动态

  • 示例:将相应的vcproj片段存储在属性表文件中,然后在需要静态库时将“FooApp静态库”属性表应用于配置/平台组合,并在需要DLL时应用“FooApp DLL”属性表。
  • 优点:这就是我真正想做的事情!
  • 缺点:似乎不可能。似乎静态和动态库之间切换的.vcproj属性(Configuration元素的ConfigurationType属性)不能被.vsprops覆盖文件。 Microsoft针对这些文件发布的架构仅列出< Tool>和< UserMacro>元件。

编辑:如果有人建议,我还尝试了一个更“聪明”的#3版本,其中我定义了一个包含名为“ModuleConfigurationType”的UserMacro的.vsprops值“2”(DLL)或“4”(静态库),并将.vcproj中的配置更改为ConfigurationType="$(ModuleConfigurationType)"。 Visual Studio以静默方式在没有警告的情况下删除该属性并将其替换为ConfigurationType="1"。非常有帮助!

我错过了更好的解决方案吗?

7 个答案:

答案 0 :(得分:5)

我可能错过了一些东西,但为什么你不能用没有文件来定义DLL项目,只是把它链接到另一个项目创建的lib? 而且,关于设置,您可以将它们分解为vsprop文件...

答案 1 :(得分:5)

有一种简单的方法可以在一个项目中创建static和dll lib版本。

创建你的dll项目。然后执行以下操作:

只需创建一个运行lib工具的nmake makefile或.bat文件。 基本上,就是这样:

lib /NOLOGO /OUT:<your_lib_pathname> @<<
<list_all_of_your_obj_paths_here>
<<

然后,在您的项目中,添加一个Post Build Event,其中命令只运行.bat文件(或nmake或perl)。然后,您将始终获得dll和静态库。 我将避免诋毁visual studio,因为不允许在Linker之前的项目中存在这个工具(在工具流程中)。

答案 2 :(得分:2)

我认为这样做的典型方法是上面的选择2。这是我使用的和我见过的许多图书馆和公司所做的。

如果您发现它对您不起作用,那么请务必使用其他内容。

祝你好运。

答案 3 :(得分:2)

我更喜欢2种配置方式。

通过项目属性窗口中的“所有配置”项设置所有常用设置。分开设置后。它已经完成了。我们去编码。

还有一个名为“批量构建”的非常好的功能,它依次构建指定的配置。

答案 4 :(得分:0)

多个项目是最好的方式 - 这是我在很多项目中最常见的配置。

也就是说,也可以通过从外部工具(如自定义vbscript)动态修改vcproj文件来实现第三个选项,您可以从make文件调用它。您可以使用shell变量来控制工具的行为。

请注意,您仍然应该使用visual studio进行构建,makefile应该只在需要创建mod时启动外部工具,然后通过实际构建命令进行操作

答案 5 :(得分:0)

由于阻止我们迁移到VS2005或更新版本的问题,我使用Visual Studio 6.0(静止版)。重建会导致严重的问题(一切都会中断)......我们很多人正在考虑游说迁移到GnuC ++,以结构化的方式向前推进,最终让我们从许可的Visual Studio产品转移到Eclipse和Linux上。

在Unix / Linux中,很容易为所有配置构建..所以我无法相信在Visual Studio中尝试完成相同任务会花费多少时间和工作效率。对于VS6.0,我到目前为止发现只有两个独立的项目似乎是可行的。我还没有尝试过多种配置技术,但会看看它是否适用于较旧的VS6.0。

答案 6 :(得分:-1)

为什么不选择版本1并使用脚本或其他东西从第一组生成第二组项目文件。这样你就知道差异只是构建dll或静态库所需的部分。