我有一个有两种可能实现的类,具体取决于预处理器开关。我处理这个的方法是创建“src \ CompSwitch1 \ class.h”和“src \ CompSwitch2 \ class.h”。在我的标准包含文件中,我使用
#ifdef CompSwitch1
#include "CompSwitch1\class.h"
#elif CompSwitch2
#include "CompSwitch2\class.h"
#else
#error "Specify CompSwitch1 or CompSwitch2"
#endif
这适用于我需要两个版本的大多数类。但是,在其中一个上,我收到链接器错误(lnk2019:未解析的外部符号)。我正在使用MS Visual Studio 2005和2008,它们都出现在它们上面。
在.h文件的顶部,我测试了预处理器选项。 另外,虽然为了简洁我只引用了.h文件,但在适当的目录中也有一个.cpp文件。
答案 0 :(得分:1)
听起来你可能已经包含了其中一个类的头文件,但是将目标文件链接到另一个类,或者都没有
答案 1 :(得分:0)
它真的应该是#ELIF DEFINED(CompSwitch2)。否则,您假设“CompSwitch2”已定义为值1 ...
答案 2 :(得分:0)
尝试将cpp实现文件包含在以下预处理器行的标题后插入:
//in compswitch1.cpp
#ifndef CompSwitch1
# error "inconsistent header included"
#endif
//in compswitch2.cpp
#ifndef CompSwitch2
# error "inconsistent header included"
#endif
如果你编译错误的header / cpp对,你应该至少得到编译错误而不是链接错误。有更容易识别/修复;)
另一种可能性是cpp文件根本不包含在编译中。在cpp文件中放入一个消息pragma,看看它们是否完全被编译:
#pragma message( "Compiling " __FILE__ )
或者尝试在构建目录中识别是否创建了与cpp编译单元相关的目标文件。
希望有所帮助,
Ovanes
答案 3 :(得分:0)
您可以使用预处理的cpp文件(扩展所有包含和宏的阶段)。
在VS 2008中右键单击解决方案资源管理器中的文件 - >属性 - > C ++ - >预处理器并设置“生成预处理文件”设置“带行号(/ P)”。 然后再右键单击您的文件并选择“编译”。扩展名为“i”的文件(例如main.i)将在cpp所在的同一目录中创建。打开它,看看包含哪个包含文件。
这种方法很难解决硬编译问题(例如,系统头文件中的某些宏替换了代码中的某些内容)。