【问题标题】:Visual Studio 2010 C++ awkward linker erratic behaviourVisual Studio 2010 C++ 笨拙的链接器不稳定行为
【发布时间】:2024-01-21 05:37:01
【问题描述】:

在做一个大项目时我遇到了这个问题:链接器不时拒绝“查看”类的实现,在找到该特定类(Board)的方法的任何地方抛出“找不到符号”异常.

一些“技术”细节:

  • 我对我的 .cpp 文件使用过一次 #pragma。我知道他们最终什么都不做(或不应该做)任何事情,因为 .cpp 文件不包含在其他文件中,但我养成了这个坏习惯,在我创建的每个代码文件的顶部写下它。

  • 该类实现其 .h 文件中声明的所有方法

  • 该类包含项目的其他头文件,但许多文件中都包含相同的头文件,但这个特定的类是唯一存在编译问题的类。

  • 在我写了一个我的类包含并使用的模板类后不久就开始出现问题,但是如上所述,其他类没有问题(所以我无法判断模板是或与问题无关)。

最奇怪的是:

  • 当链接器因“未找到符号”异常而失败时(它只在某些时候这样做),如果我在类 .cpp 文件中切换 #pragma once 指令,则下一次编译工作。这意味着有时我需要注释“#pragma once”才能成功编译,有时我需要取消注释。

如果您需要更多信息,例如类的 .h 和 .cpp 文件,我会尽快写出来。

感谢您的宝贵时间!

编辑:

更多信息:

  • 当问题第一次出现时,我尝试尽可能多地注释类的方法和字段,试图隔离问题。有时,删除类和模板之间的链接会导致编译良好,但后来它并不重要。在我的项目的不同部分(文件/命名空间/等)添加类的实例也没有任何区别。

  • Visual Studio 安装在 C:\,项目在 D:\,两个分区都是 NTFS。

  • 这是我唯一遇到问题的项目,在问题开始之前和之后,我用相同的编程风格制作并编译并成功运行了许多其他项目。

  • 当问题出现时,我尝试重建整个项目并手动清理 .obj 文件,但没有任何区别。

【问题讨论】:

  • .cpp中有模板代码的实现吗?
  • 不,我将它放在一个 .h 文件中,因为据我所知,您不能将模板的声明和实现分开放在不同的文件中。我编写模板的方式与编写 C# 类的方式差不多。
  • @cantrem:好的,很好。 :) 接下来,如果链接失败,您是否需要更改 #pragma once,还是需要更改其他内容?不做任何改动直接重新编译怎么样?
  • 只有这样,它才有效。我不确定“直接重新编译”是什么意思。如果您说的是重建所有项目,那么我尝试了几次,但没有任何区别。
  • @cantrem:是的,这就是我的意思,只是在失败后直接重建。如果您更改任何其他行并尝试重新编译会发生什么?

标签: c++ visual-studio-2010 linker compilation


【解决方案1】:

此链接http://www.cplusplus.com/forum/beginner/7877/ 为不同风格的 incude 守卫提供了有趣的讨论。
这表明#pragma once failed 的情况可能会对您有所帮助。

我的感觉是避免#pragma once,用于可移植代码。

【讨论】:

  • 我不认为该链接涵盖了我的情况。诚然,pragma 是不可移植的,但由于我只在使用 VS2010 编译器的 Windows 机器上工作(至少目前是这样),所以这应该不是问题。此外,即使我从类的实现文件中删除了 pragma 指令,问题仍然存在。我真的希望其他文件中的其他编译指示不是我的问题的原因。
  • #pragma once 在 .cpp (或翻译单元,如果你想要正式名称)中是无用的。它仅对标题有用,因此无论如何都无关紧要。
  • 是的,这就是我觉得这个错误(如果它真的是一个错误)非常奇怪的原因之一。
最近更新 更多