Visual Studio 2010 C++笨拙的链接器不稳定的行为
Visual Studio 2010 C++ awkward linker erratic behaviour
在一个大项目中,我遇到了这个问题:链接器不时拒绝"查看"类的实现,在找到特定类(Board)的方法的地方抛出"未找到符号"异常。
一些"技术"细节:
-
我在.cpp文件上使用过一次#pragma。我知道他们最终什么都不做(或者不应该做),因为.cpp文件不包括在其他文件中,但我养成了在创建的每个代码文件的顶部都写这个的坏习惯。
-
该类实现了在其.h文件中声明的所有方法
-
该类包括项目的其他头,但许多文件中都包含相同的头,但这个特定的类是唯一存在编译问题的类。
-
在我写了一个模板类后不久,问题就开始出现了,我的类包括并使用了这个模板类,但如上所述,其他类对此没有问题(所以我不知道这个模板是否真的与问题有关)。
最奇怪的部分是:
- 当链接器因"symbol not found"异常而失败时(它只在某些情况下会这样做),如果我在class.cpp文件中切换#pragma once指令,则下一次编译可以进行。这意味着有时我需要注释"#pragma once"才能成功编译,而其他时候我需要取消注释
如果您需要更多信息,比如类的.h和.cpp文件,我会尽快编写。
谢谢你抽出时间!
编辑:
更多信息:
-
当问题第一次出现时,我试图对类中尽可能多的方法和字段进行注释,试图隔离问题。有时,删除类和模板之间的链接会产生良好的编译效果,但后来这并不重要。在我的项目的不同部分(文件/名称空间等)中添加类的实例也没有任何区别。
-
Visual Studio安装在C:\上,项目安装在D:\上,两个分区都是NTFS。
-
这是我唯一遇到问题的项目,在这个项目出现问题之前和之后,我用相同的编程风格成功地制作、编译和运行了许多其他项目。
-
当问题出现时,我尝试重建整个项目并手动清理.obj文件,但没有任何区别。
此链接http://www.cplusplus.com/forum/beginner/7877/为不同风格的incude卫士提供了有趣的讨论
这表明#pragma一旦失败,可能会对你有所帮助。
我的感觉是避免#pragma一次,对于可移植代码。
- 针对静态库的 G++ 链接不起作用
- boost::存在符号链接不取消引用
- 模板外部链接不起作用
- 与LLVM LLD链接不起作用[MACOS]
- 返回值上的 C++ 方法链接不起作用
- Boost Logger静态链接:不起作用
- CMake 链接不正确?
- 链接不返回对象的运算符
- cocos2d android编译时链接不起作用
- 如果我在GCC中编译并链接不需要的库,会发生什么
- Visual Studios 9 Dll链接不一致
- 尝试使用 swig 将C++库与 C# 链接 - 不会让我添加对 C# 项目的 resulging dll 的引用
- 编译伪C++程序时链接不成功
- 为什么隐式DLL链接需要相关的Lib文件,而显式链接不需要
- CMake链接不是子文件夹
- Java c++ jni链接不满足错误
- SFML 2.1代码::Blocks静态链接不工作
- 增加系统链接不显示MFC对话框
- 从源代码构建GCC 5.4;这样构建的可执行文件试图链接不兼容的libstdc++,但运行失败
- 为什么这个c++链接不能工作?(OSX小牛)