【发布时间】:2012-08-01 04:07:03
【问题描述】:
我正在使用 Visual Studio 2010,其中包含大量项目和解决方案文件。但现在我发现自己对 ProjectReferences 有点依赖地狱:
- 项目
Simple生成一个静态库。 - 项目
Foo和Bar依赖于Simple,并且还生成静态库。 - 项目
Module依赖于Foo并生成一个DLL。 - 项目
Module2依赖于Bar并生成一个DLL。
所以依赖树看起来像这样:
Simple
|
____________/ \__________
| |
Foo Bar
| |
Module Module2
有了ProjectReferences,我可以让Module依赖Foo并自动链接Foo.lib。这很好用。
但是,有没有办法让Module 自动链接到Simple.lib?
这似乎应该是可能的。 Module 依赖于Foo,它依赖于Simple,所以它似乎应该能够选择“链接到我的参考文献的输出和我的参考文献的参考文献”。但是我找不到任何可以让我这样做的东西。
“链接库依赖项”选项不这样做。它仅在 Foo.lib 中链接,然后我收到有关未解析的外部符号(在 Simple.lib 中定义的符号)的链接错误。
将Foo->Simple 和Bar->Simple 的“链接库依赖关系”设置为true 一开始似乎有效,直到您有一个同时使用Foo 的项目和Bar。该设置实际上将Simple.lib 嵌入到Foo.lib 和Bar.lib 中,如果您尝试同时使用Foo.lib 和Bar.lib,则会出现“符号已定义”错误。这是正确的错误 - 我实际上不想将 Simple.lib 放在任何其他库中。
我可以将ProjectReferece从Module添加到Simple,但是在每个使用Foo的项目中设置这很繁琐,并且违反了Foo的封装。 Module 不需要知道 Simple。显然链接器需要知道Simple,但它应该能够通过遵循 ProjectReferences 来弄清楚。
这很重要:假设在维护期间,创建了一个新项目:Basic,它创建了一个静态库,Simple 依赖于Basic。现在我们必须直接或通过另一个 ProjectReference 将每个具有 ProjectReference 的单个项目更新为 Simple(在此示例中,它只有两个项目,Module 和 Module2,但实际上有几十个)。这很乏味。
tl;dr 有没有办法自动链接到我的依赖项的静态库中?
【问题讨论】:
-
这与您的要求略有不同,但我通常会在头文件中添加一个编译指示链接器注释以自动包含所需的 lib 文件。
#pragma comment(lib,"simple.lib") -
@TheSteve,我也这样做了,但这可能会导致链接顺序依赖性问题。
-
@PermanentGuest,他试图将一个库嵌入到另一个库中。我不想那样做。我正在寻找利用 ProjectReferences 的解决方案。
-
其实可能是stackoverflow.com/questions/6437538/vs2010-static-linking-issue的副本。这是一个 VS 错误,即“已修复”。我将安装 SP1,看看是否真的能解决它。
标签: c++ visual-studio-2010 project-reference