C++ 如何在VS 2010中自动链接依赖项的依赖项?
我正在使用VisualStudio2010,其中包含很多项目和解决方案文件。但现在我发现自己对ProjectReferences有点依赖: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 | ____________/ \
- Project
生成一个静态库Simple
- 项目
和Foo
依赖于Bar
,还生成静态libSimple
- Project
依赖于Module
并生成一个DLLFoo
- 项目
依赖于Module2
并生成一个DLLBar
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">