当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《从同一个项目构建DLL和静态库》经验,为你挑选了2个好方法。

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

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

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

1.多个项目文件

示例:"foo_static.vcproj"vs"foo_dll.vcproj"

亲:很容易为新库生成,而不是过多的手动vcproj munging.

Con:两个地方的设置,文件列表等太容易失去同步.

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

示例:"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关闭.)

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

示例:将相应的vcproj片段存储在属性表文件中,然后在需要静态库时将"FooApp静态库"属性表应用于配置/平台组合,并在需要DLL时应用"FooApp DLL"属性表.

优点:这就是我真正想要做的!

缺点:似乎不可能. 似乎静态和动态库之间切换的.vcproj属性(Configuration元素的ConfigurationType属性)不能被.vsprops文件覆盖.Microsoft针对这些文件发布的架构仅列出元素.

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

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



1> Xavier Nodet..:

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



2> 小智..:

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

创建你的DLL项目.然后执行以下操作:

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

lib /NOLOGO /OUT: @<<

<<

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

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有