【发布时间】: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