C++ 如何在VS 2010中自动链接依赖项的依赖项?

C++ 如何在VS 2010中自动链接依赖项的依赖项?,c++,visual-studio-2010,project-reference,C++,Visual Studio 2010,Project Reference,我正在使用VisualStudio2010,其中包含很多项目和解决方案文件。但现在我发现自己对ProjectReferences有点依赖: ProjectSimple生成一个静态库 项目Foo和Bar依赖于Simple,还生成静态lib ProjectModule依赖于Foo并生成一个DLL 项目Module2依赖于Bar并生成一个DLL 因此,依赖关系树如下所示: Simple | ____________/ \

我正在使用VisualStudio2010,其中包含很多项目和解决方案文件。但现在我发现自己对ProjectReferences有点依赖:

  • Project
    Simple
    生成一个静态库
  • 项目
    Foo
    Bar
    依赖于
    Simple
    ,还生成静态lib
  • Project
    Module
    依赖于
    Foo
    并生成一个DLL
  • 项目
    Module2
    依赖于
    Bar
    并生成一个DLL
因此,依赖关系树如下所示:

                Simple
                  |
     ____________/ \__________
     |                        |
    Foo                      Bar
     |                        |
   Module                   Module2
使用
ProjectReferences
,我可以使
模块依赖于
Foo
,并自动链接
Foo.lib
。这个很好用

但是有没有办法让
模块
自动链接到
Simple.lib

看来这应该是可能的<代码>模块
依赖于
Foo
,后者依赖于
简单
,因此它似乎应该能够有一个选项用于“在我的引用和我的引用的引用的输出中链接”。但我找不到任何让我这么做的东西

“链接库依赖项”选项不起作用。它只在Foo.lib中链接,然后我得到一个关于未解析的外部符号(在Simple.lib中定义的符号)的链接错误

Foo
->
Simple
Bar
->
Simple
引用的“链接库依赖项”设置为
true
,一开始似乎是可行的,直到您有一个同时使用
Foo
Bar
的项目。该设置实际上将
Simple.lib
嵌入
Foo.lib
Bar.lib
的内部,如果您尝试同时使用
Foo.lib
Bar.lib
,则会出现“符号已定义”错误。这就是正确的错误-我实际上不想把
Simple.lib
放在任何其他lib中

我可以将
projectrefereece
Module
添加到
Simple
,但在每个使用
Foo
的项目中设置这一点很繁琐,而且违反了
Foo
的封装<代码>模块不需要了解
简单
。显然,链接器需要了解
Simple
,但它应该能够通过以下项目参考来了解这一点

这就是问题的原因:假设在维护期间创建了一个新项目:
Basic
,它创建了一个静态库,
Simple
依赖于
Basic
。现在,我们必须直接或通过另一个项目引用(在本例中,只有两个项目,
Module
Module2
,但实际上有几十个)将具有
ProjectReference的每个项目更新为
Simple
。那太乏味了


tl;dr是否有一种方法可以自动链接我的依赖项的静态库?

显然,这是Visual Studio 2010中的一个错误:

不幸的是,微软以“已修复”的方式关闭了该漏洞——但事实并非如此。这更多的是解决问题,但这不是我认为的真正的解决办法。(真正的修复程序应该是补丁或服务包,而不是需要在每台机器上手动调整的东西)

“修复”是执行以下操作:

修改
%程序文件(x86)%\MSBuild\Microsoft.cpp\v4.0\Microsoft.CPPBuild.Targets
并更改行:

<Target Name="GetResolvedLinkLibs" Returns="@(LibFullPath)"
 DependsOnTargets="$(CommonBuildOnlyTargets)">



因此,只需添加;ResolvedLinkLib将零件解析到该文件。然后VS将链接到dependencies of dependencies。

这与您的要求略有不同,但我通常会在头文件中添加pragma链接器注释,以自动包含所需的lib文件
#pragma comment(lib,“simple.lib”)
@TheSteve,我也这么做过,但这可能会导致链接顺序依赖性出现问题。可能重复[@PermanentGuest,他试图将一个库嵌入另一个库中。我不想这样做。我正在寻找一个利用ProjectReferences的解决方案。实际上,它可能是的副本。这是一个VS错误,已“修复”。我将安装SP1,看看这是否真的修复了它。
<Target Name="GetResolvedLinkLibs" Returns="@(LibFullPath)"
 DependsOnTargets="$(CommonBuildOnlyTargets);ResolvedLinkLib">