我有一个库StudentModelLib
,其中CStudentModeler
是库中的主要类。它有一个日志选项,我以PRETTY_LOG
是否启用为条件。如果仅在PRETTY_LOG
启用时,我是否包含CPrettyLogger
,初始化它(稍后)和/或实际记录事物。
同一解决方案中的另一个项目StudentModel2
,静态链接到StudentModelLib
。它包含库中的StudentModeler.h
并在运行时实例化CStudentModeler
。
如何设置怪异:
PRETTY_LOG
PRETTY_LOG
在可执行文件的代码中实例化CStudentModeler
时,奇怪就开始了。此时,调试器似乎对它应该使用哪个版本的CStudentModeler
感到困惑,并且将鼠标悬停在IDE中的变量上会导致真正令人困惑的结果。当EXE运行时,它也会出现内存损坏。
我的假设是已编译的库CStudentModeler
有一个prettyLogger
成员,但编译的EXE使用.h文件并禁用该指令,它假设CStudentModeler
不拥有prettyLogger
成员。我猜测会发生内存损坏,因为库和EXE对于类的成员变量在堆上的位置有不同的定义。
我的问题如下:
为了这个测试,CPrettyLogger
有一个空的默认构造函数,所有其他与之相关的代码都被注释掉了。简单地实例化就会导致错误。
这是库的一部分,包含条件成员变量。
class CStudentModeler : public CDataProcessor2
{
// Configuration variables
string student_id;
// Submodules
CContentSelector contentSelector;
EventLog eventLog;
#ifdef PRETTY_LOG
CPrettyLogger prettyLogger; // <--- the problem?
#endif
// Methods
void InitConcepts();
void InitLOs();
public:
CStudentModeler( string sm_version, string session_id, string url,
string db_user, string db_password, string db_name,
SMConfig config );
~CStudentModeler();
}
答案 0 :(得分:1)
library_options_opt1_yes_opt2_no_opt3_42_...
,并让标题中的客户端代码引用它。如果不匹配,您将遇到链接错误。