27

我有许多在 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". 太有帮助了!

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

4

7 回答 7

6

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

于 2011-01-08T16:07:34.370 回答
5

有一种简单的方法可以在一个项目中同时创建静态库和 dll 库版本。

创建您的 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 之前的项目中存在(在工具流中)。

于 2011-08-24T20:42:27.427 回答
2

我认为这样做的典型方式是上面的选择 2。这是我使用的,也是我看到许多图书馆和公司所做的。

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

祝你好运。

于 2008-12-17T22:42:13.527 回答
2

我更喜欢2种配置方式。

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

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

于 2008-12-18T09:07:36.540 回答
0

多个项目是最好的方式——这是我在无数项目中最广泛看到的配置。

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

请注意,您仍应使用 Visual Studio 进行构建,makefile 仅应在需要制作 mods 时启动您的外部工具,然后执行实际的构建命令

于 2008-12-18T03:03:02.920 回答
0

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

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

于 2009-02-19T16:28:14.510 回答
-1

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

于 2008-12-18T08:35:41.720 回答