最近打算使用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=”。
posted on 2008-08-30 12:41
zealsoft 閱讀(1759)
評論(2) 編輯 收藏 引用 所屬分類:
錯誤處理