我的名字叫Amit Mohindra,我是Visual C++ IDE团队的项目经理。在这篇文章中,我想谈谈项目之间的参考。在VS2010版本中,我们将C++构建和项目系统移动到基于MSBug的。marianluparu写了一篇优秀的文章,详细介绍了新构建/项目系统的变化和优点( http://blogs.msdn.com/vcblog/archive/2008/11/20/printf-hello-msbuild-n.aspx ).
从visualstudio6开始,项目到项目的引用就一直存在。然而,这个术语随着时间的推移而不断发展。在Visual Studio 8之前,本机技术使用项目依赖项来定义引用。使用Visual Studio 8,本机项目能够定义项目到项目的引用。
“Project-to-Project references”定义了Project A创建对Project B的引用的机制,Project A使用Project B的输出来实现其功能。 这个特性被拥有大量源代码库的用户所使用,一个解决方案包含许多大型项目,一个项目的输入由另一个项目的输出驱动。
传统上,有三个变量控制项目引用的工作方式:
· 忽略导入库 (在引用项目上设置)
告诉链接器不要尝试将此生成的任何.lib输出链接到任何依赖项目中。这允许项目系统处理生成时不生成.lib文件的.dll文件。如果一个项目依赖于另一个生成DLL的项目,则项目系统将自动链接该子项目生成的.lib文件。生产COM DLL或仅资源DLL的项目可能不需要这样做;这些DLL没有任何有意义的导出。如果DLL没有导出,链接器将不会生成.lib文件。如果磁盘上不存在export.lib文件,并且项目系统告诉链接器链接到这个(丢失的)DLL,链接将失败。
“使用” 忽略导入库 ” 来解决这个问题。设置为“时” 是的 ” ,项目系统将忽略该.lib文件的存在或不存在,并导致依赖于此项目的任何项目不与不存在的.lib文件链接。
· 链接库依赖项 (在引用项目上设置)
允许您选择在依赖项目生成的.lib文件中进行链接。通常,您需要在.lib文件中进行链接。如果不想使用生成的.lib文件,只需将此链接器设置为“False”。
· 使用库依赖项输入 (在引用项目上设置)
在大型项目中,当依赖项目生成.lib文件时,将禁用增量链接。如果有许多依赖项目生成.lib文件,则构建应用程序可能需要很长时间。当此属性设置为 是的 ,项目系统链接到依赖项目生成的.libs的.obj文件中,从而启用增量链接。
然而,在这个设计中有一些限制,并且设计在允许项目定义引用来控制行为方面不是很灵活。考虑以下非常简单的示例:
– 项目A 定义对的项目到项目的引用 项目B 和 项目C (二者) 项目B 和 C 创建.lib输出)。 项目A 只想消耗 项目B 也不是为了 项目 C .
o 在VS2008中,这是通过创建对项目A的引用来实现的,项目A的“链接库依赖关系”属性设置为“是”,然后为项目A设置“忽略导入库” 项目B 到“不”。
§ 然而,这种方法有一个缺点,即如果有另一种方法的话 D项目 引用 项目B 它将受到“Ignore Import Library”属性设置为“No”的限制。上图所示的场景在VS2008中无法实现。
在VS2010中,我们通过在项目引用上支持引用级元数据来启用上述场景。现在可以在项目引用级别设置“链接库依赖项”和“使用库依赖项输入”属性。要实现上述场景:
– 项目A 将创建对的项目引用 项目B 和 项目C
– 对于 项目B 将“链接库依赖项”属性设置为“False”
– D项目 将创建对的项目引用 项目B 和 项目C . 在这种情况下,属性的全局默认值(“Link Library Dependencies”设置为“True”,而“Use Library dependencity Inputs”设置为“False”)将定义行为。
要设置这些属性,可以使用父项目属性页中的“框架和引用”选项卡( 项目A )具体如下:
在Project A.vcxproj中看起来如下所示:
< 项目组 >
< 项目参考 包括 = “ ..项目B.VCX项目 “ >
< 项目 > {fcefddd7-fc28-490a-a937-ee8ce39c43d7} 项目 >
< 私人 > 是的 私人 >
< 引用输出程序集 > 是的 引用输出程序集 >
< 复制本地卫星组件 > 假 复制本地卫星组件 >
< 链接库相关性 > 假 链接库相关性 >
< 使用库相关输入 > 假 使用库相关输入 >
项目参考 >
< 项目参考 包括 = “ …项目C.VCX项目 “ >
< 项目 > {687d125d-f004-4901-8654-725f65c93528} 项目 >
项目参考 >
项目组 >
这将导致以下命令行 项目A :
同样地 对于 D项目 :
在D.vcxproj项目中,它看起来如下所示:
< 项目组 >
< 项目参考 包括 = “ ..项目B.VCX项目 “ >
< 项目 > {fcefddd7-fc28-490a-a937-ee8ce39c43d7} 项目 >
项目参考 >
< 项目参考 包括 = “ …项目C.VCX项目 “ >
< 项目 > {687d125d-f004-4901-8654-725f65c93528} 项目 >
项目参考 >
项目组 >
这将导致以下命令行 D项目 :
谢谢,
阿米特·莫欣德拉