woaidongmao

文章均收录自他人博客,但不喜标题前加-[转贴],因其丑陋,见谅!~
随笔 - 1469, 文章 - 0, 评论 - 661, 引用 - 0
数据加载中……

运行Google CTemplate首页的例子遇到_CrtIsValidHeapPointer异常

最近打算使用Google CTemplate作为模板引擎,但是运行其主页上的例子居然出现了错误。程序运行的结果正常,但是在退出时导致了_CrtIsValidHeapPointer异常,主要是释放string变量时出现了错误。搜索了一下Google CTemplate的讨论组,说如果编译库文件所使用的CRT版本和编译程序所使用的CRT版本不一致会导致这个问题。DLL库采用的CRT是多线程DLL方式的,所以应用程序也必须使用这个方式,这就需要在应用程序的工程选项中将CRT由默认的单线程方式改为多线程DLL方式。如下图所示。

clip_image002

 

不过这有时不太方便,也可以把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

记得在这些文件的编译属性中选择不使用预编译头,否则会出现编译错误。

 

clip_image003 2008年8月31:以上介绍的是0.90版本,在0.91版本中src\template_from_string.cc 文件不存在了。

clip_image003 2008年9月15:采用上面介绍的方法有个缺陷,就是会出现很多编译和链接的警告C4251LNK4049LNK4071。这主要是因为在CTemplate的代码中,定义了:

 

clip_image004clip_image005Code
#ifndef CTEMPLATE_DLL_DECL
# define CTEMPLATE_DLL_DECL  __declspec(dllimport)
#endif

所以需要在编译的命令行加上“/D CTEMPLATE_DLL_DECL=”

 

posted on 2010-03-04 12:17 肥仔 阅读(797) 评论(0)  编辑 收藏 引用 所属分类: 模板引擎


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理