4

在 Visual Studio 2010 解决方案中,我有 2 个项目:

  • 项目A是一个 dll 项目
  • 项目B是一个可执行项目并且依赖于项目A(通过解决方案项目依赖属性配置)

A当我在以指定声明的项目中添加新 API__declspec(dllexport)并从项目中调用它们时B

如果我只是简单地“构建”项目B,事实证明项目A是先构建的,然后是项目B,但链接器没有找到新的 API 并将它们报告为未解析的外部符号。现在,如果我“重建”项目B,解决方案将完全重建,并且我没有未解决的符号链接器错误。

知道什么可能导致构建器使用简单的构建操作找不到新符号以及如何解决这个问题?

4

2 回答 2

4

用您提供的信息很难解释这一点。它清楚地强烈暗示了构建顺序问题,即使您记录了 A 先构建。

可能对 VS 中可用的并行构建功能有疑问。如果它没有看到项目之间的任何依赖关系,那么它允许项目同时构建,利用您的机器具有多个 cpu 内核。您可以看到 A 开始建造,但 B 也立即开始建造。在“输出”窗口中用编号的消息表示,以 1> 和 2> 开头。

如果确实存在依赖关系,那么它就变成了一场比赛。如果 B 在 A 完成链接之前进入链接阶段,那么它肯定会遇到麻烦。但这通常是由它抱怨它找不到 DLL 项目的导入库来宣布的。找到缺少某些标识符的旧版本 A.lib 将是一个不寻常的极端情况。然而,当它在编写时找到 A.lib 时,事情确实变得有趣了。这确实解释了您观察到的情况。

最好的办法是确保 VS 知道存在依赖项,而不依赖于它自己找出它。对于 C 或 C++ 项目,它不是很擅长解决这个问题。在解决方案资源管理器窗口中右键单击您的 B 项目,然后单击“项目依赖项”。勾选 A 项目。现在它将不再同时构建,B 在 A 完成之前不会开始构建。这本质上是您手动解决问题的方法。

如果您仍然遇到问题,那么您需要怀疑您机器上的其他程序,即那些会弄乱文件的程序。反恶意软件总是在这样的麻烦制造者名单的首位。Avast 因给 VS 带来困难而臭名昭著。

于 2013-06-12T12:24:33.413 回答
0

我有一个问题每次都会发生吗?它不应该。根据现有资源构建命令链接、创建二进制文件、查找资源。不,如果您更改任何资源,如库、图像表单设计等。那么您需要rebuild (clean+build).

在另一个项目构建之前构建一个项目。您必须通过以下方式添加依赖项:

  1. 右键单击解决方案>属性。
  2. 转到 Project Dependencies > 选择项目并勾选依赖项目。
  3. 最后右键单击您的项目 B 选择Set as StartUp Project

这将迫使您的项目按顺序构建。

于 2013-06-17T14:46:02.333 回答