3

我在 Visual C++ 2010 解决方案的几个项目中使用了boost 库。我目前正在做的是通过设置修改每个项目的属性:

  1. Properties->Configuration Properties->C/C++->General->Additional Include Directories 包含boost目录C:\boost\boost_1_47

  2. Properties->Configuration Properties->Linker->General->Additional Library Directories 以包含 boost lib 目录C:\boost\boost_1_47\lib

现在我将我的 boost 版本升级到 1.51,我意识到我通过多次指定此信息(即每个项目一次)违反了 DRY。我想在一个地方定义提升信息。

经过研究,似乎属性表是一个很好的解决方案。我已经阅读了有关属性表继承的信息,但我看不出这有什么用,因为似乎如果您想添加一个特定于项目的包含目录,那么您将必须在该特定项目的属性中设置附加包含目录然后将覆盖定义 boost 包含目录的继承属性表。如果我对此有误,请纠正我。

所以我的下一个想法是创建一个名为 GlobalMacros.prop 的属性表并定义一个类似的用户宏$(BoostDir),然后将此属性表添加到每个项目中。然后我可以在定义包含目录和库目录时在每个项目的属性中使用宏。但是,在创建宏时,有一个选项“将此宏设置为构建环境中的环境变量”,我不确定它的作用或是否应该设置它。

总的来说,我想知道减少常见设置的重复配置定义的最佳方法是什么?

4

1 回答 1

4

我实际上是最初在 VS 2005 中在 Visual C++ 中实现属性表的开发人员(尽管我不对 VC++ 项目属性对话框的混乱负责)。警告:我在 2005 年之后停止了 VC++ 的工作,所以下面的内容对于您的版本可能并不完全准确。

在属性管理器中,您应该能够在所有项目中多选所有项目配置并添加新的属性表。这将自动从同一属性表继承这些项目配置。在该属性表中,直接设置 boost include 和 library 目录,或者为BoostVersionBoostDir使用宏,并在属性表的属性中使用这些宏。

如果项目配置已选中“从父级或项目默认值继承”(这控制在 2005/2008 年插入 $(Inherit) 与 $(NoInherit) 并在 2010/2012 年插入 %(<propertyname>)),您应该查看项目配置中设置的任何项目特定属性,默认情况下,附加到属性表中的值。

您可以通过转到一个项目并检查编译器的“命令行”选项卡以查看开关是否符合您的预期来确认这一点。

编辑:请注意,VC++ 中有两种类型的属性:“单值”和“多值”。单值属性的一个示例是编译器的警告级别。单值属性的命令行上的值来自指定它的属性继承链中的第一个位置,从项目配置开始,然后是属性表,然后是项目系统中的内置默认值。多值属性的一个示例是编译器的包含目录。除非指定了 $(NoInherit) (2005/2008) 或未指定 %(<propertyname>) (2010/2012),否则多值属性将与其父属性表连接。因此,默认情况下,

于 2012-12-22T22:52:33.620 回答