Visual Studio:添加新DLL API后未解析的外部符号

时间:2013-05-28 07:52:29

标签: c visual-studio-2010 dll linker

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

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

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

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

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

2 个答案:

答案 0 :(得分:4)

很难用您提供的信息解释这一点。它显然强烈建议构建顺序问题,即使您记录了A首先构建。

可能在VS中可用的并行构建功能存在问题。如果它没有看到项目之间的任何依赖关系,那么它允许项目同时构建,利用具有多个cpu核心的计算机。你可以看到A起始建筑,但B也开始建造。在“输出”窗口中以编号的消息表示,前面带有1>和2>。

如果确实存在依赖性,那么它就变成了种族。如果B在A完成链接之前进入链接阶段,那么肯定会遇到麻烦。但这通常是由于抱怨它无法找到DLL项目的导入库而宣布的。它发现缺少一些标识符的旧版A.lib将是一个不寻常的角落案例。然而,当它在写入时找到A.lib时,事情会变得有趣。哪个 解释了你观察到的内容。

最好的办法是确保VS知道存在依赖关系,而不依赖于它自己搞清楚。对于C或C ++项目来说,这不是很好。在Solution explorer窗口中右键单击B项目,然后单击“Project dependencies”。勾选A项目。现在它将不再同时构建,B将在A完成之后才开始构建。这基本上是你手工解决问题的方法。

如果你还有问题,那么你需要怀疑你机器上的其他程序,那种混乱文件的程序。反恶意软件软件始终是这类麻烦制造者的首选。 Avast因为给VS带来困难而特别臭名昭着。

答案 1 :(得分:0)

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

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

  1. 右键单击解决方案>属性。
  2. 转到项目依赖项>选择项目并勾选依赖项目。
  3. 最后右键点击您的项目B选择Set as StartUp Project
  4. 这会强制您的项目按顺序构建。