想象一下,我们的Visual Studio 2010解决方案的项目层次结构如图所示:
总共5个项目:1个应用程序,4个静态库,彼此依赖,如图中箭头所示。
在我们拥有的真正解决方案中,有:
每个level-1库几乎都依赖于所有2级库,每个应用程序依赖于1个(很少2-3个)1级静态库。
问题是如何正确设置MSVS2010的框架和参考标签以构建此配置,并提供 easy 方式来添加新的顶级应用程序。 Easy 意味着我不想手动将所有2级库添加到每个应用程序。最好的解决方案是仅引用应用程序中的level-1库,仅引用level-1 libs引用level-2 libs。
我已经尝试过以下方法:
第二种方法可以与不同的链接库依赖关系和使用库依赖关系输入标记值(每个引用的值,而不是链接器/库管理器页面上的值)一起使用!)。
在应用程序项目引用页面链接库依赖项 TRUE 和使用库依赖项输入 FALSE 对于所有引用的level-1 libs。在库项目中,这两个都是 FALSE (默认值)。有时它可以工作(特别是在调用完整的解决方案重建时),但是从链接器和库管理器命令行(我在Project Properties中看到它们),很明显它不应该工作 - 没有任何东西告诉链接器链接二级库。它们也没有打包到level-1 libs(我从 dumpbin 输出中看到)。当我第一次在第一级库上按“构建”,然后尝试“构建”应用程序时,它失败了。
与以前相同,但在第1级lib项目中,我为每个引用的2级lib设置链接库依赖关系为 TRUE 。这告诉图书管理员将level-2 libs包含在level-1库中(可以使用 dumpbin 进行验证)。它在链接应用程序时失败,因为每个级别2的lib存在于多个实例中 - 每个级别1个lib一个实例。
与#1相同,但使用库依赖关系输入在每个引用的level-1 lib的应用程序项目中都是 TRUE 。突然,通过此设置,应用程序链接器现在链接整个层次结构中来自级别1和级别2库的所有目标文件。这很有效,但这种行为看起来像是某种神奇的东西,对我来说并不清楚。当我仅从应用程序引用level-1 libs时,为什么它会链接level-2库* .objs?如果它是正确的行为,那么为什么不链接方法#1中的level-2库?
我们也在其他平台上使用CMake来构建这个项目,至少使用Makefiles生成器CMake处理这样的项目层次结构很好 - 它只是在链接应用程序时链接来自所有层次结构级别的静态库。