最近打算使用Google CTemplate作为模板引擎,但是运行其主页上的例子居然出现了错误。程序运行的结果正常,但是在退出时导致了_CrtIsValidHeapPointer异常,主要是释放string变量时出现了错误。搜索了一下Google CTemplate的讨论组,说如果编译库文件所使用的CRT版本和编译程序所使用的CRT版本不一致会导致这个问题。DLL库采用的CRT是多线程DLL方式的,所以应用程序也必须使用这个方式,这就需要在应用程序的工程选项中将CRT由默认的单线程方式改为多线程DLL方式。如下图所示。
不过这有时不太方便,也可以把CTemplate所需要的文件直接加到工程中,好在文件不多:
· src\base\arena.cc
· src\htmlparser\htmlparser.cc
· src\htmlparser\jsparser.cc
· src\windows\port.cc
· src\htmlparser\statemachine.cc
· src\template.cc
· src\template_dictionary.cc
· src\template_from_string.cc
· src\template_modifiers.cc
· src\template_namelist.cc
· src\template_pathops.cc
记得在这些文件的编译属性中选择“不使用预编译头”,否则会出现编译错误。
2008年8月31日:以上介绍的是0.90版本,在0.91版本中src\template_from_string.cc 文件不存在了。
2008年9月15日:采用上面介绍的方法有个缺陷,就是会出现很多编译和链接的警告C4251和LNK4049、LNK4071。这主要是因为在CTemplate的代码中,定义了:
Code
#ifndef CTEMPLATE_DLL_DECL
# define CTEMPLATE_DLL_DECL __declspec(dllimport)
#endif
所以需要在编译的命令行加上“/D CTEMPLATE_DLL_DECL=”