【问题标题】:Visual Studio : Unresolved external symbols after adding new DLL APIsVisual Studio:添加新的 DLL API 后未解析的外部符号
【发布时间】:2013-05-28 07:52:28
【问题描述】:

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

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

当我在项目 A 中添加新的 API 时声明了 __declspec(dllexport) 并从项目 B 中调用它们。

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

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

【问题讨论】:

    标签: c visual-studio-2010 dll linker


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 感谢您的回答。我也考虑了一个并行构建问题,但事实并非如此。项目 B 在项目 A 完成后有效地开始构建,并且在项目依赖项视图中勾选了相应的依赖项。所以我也怀疑一些更明显的东西,某种文件系统缓存问题。整个项目和输出目录位于文件服务器上。您知道这方面的任何解决方法吗?
    • 我试图在最后一段中解决这种可能性。您通过构建到单独的文件服务器而不是本地磁盘来添加额外的故障模式。很难就如何解决这个问题给出具体建议,一切皆有可能。但肯定不常见。如果您在问题中记录了这些基本细节,那么我就不会发布这个答案了。请务必包含它们,以便我可以删除此答案。
    【解决方案2】:

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

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

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

    这将强制您的项目按顺序构建。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-28
      • 1970-01-01
      • 2015-10-30
      相关资源
      最近更新 更多