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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (25)

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

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

什么是最好的方法来做到这一点?我考虑过这些方法:

1.多个项目文件

  • 例如:“foo_static.vcproj”vs“foo_dll.vcproj”
  • Pro:易于为新库生成,不需要太多的手动vcproj扫描。
  • Con:两个地方的设置,文件列表等都很容易失去同步。

2.单个项目文件,多种配置

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

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

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

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

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

提问于
用户回答回答于

我可能错过了一些东西,但是为什么你不能定义没有文件的DLL项目,并让它链接由另一个项目创建的lib。

用户回答回答于

有一种简单的方法可以在一个项目中创建静态和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之前的项目中(在工具流程中)。

所属标签

可能回答问题的人

  • uncle_light

    5 粉丝518 提问8 回答
  • 嗨喽你好

    7 粉丝480 提问8 回答
  • 人生的旅途

    10 粉丝484 提问7 回答
  • 无聊至极

    4 粉丝504 提问6 回答

扫码关注云+社区

领取腾讯云代金券