在CLR的Form程序中, 想使用Boost::regex, 但是只要include<boost/regex>, 程序启动时就崩溃了
环境:VC2008, VC2010, boost 1.48 , 1.53 均能都能重现
重现步骤:
1. "New Project"->"Visual C++"->"CLR"->"Windows Forms Application" ==OK
2. 在stdafx.cpp中加入: #include <boost/regex.hpp>
3. 在项目属性C++, Linker加上boost目录
C++ : $(BOOST_DIR)
Linker: $(BOOST_DIR)\stage\lib
4. 修改Commoon Language Runtime Support才能编译通过, (默认是/clr:pure)
General->"Commoon Language Runtime Support"-->(/clr)
编译运行就Crash了, Debug版显示call stack:
msvcr100d.dll!_msize_dbg
msvcr100d.dll!_dllonexit_nolock
msvcr100d.dll!__dllonexit
TBForm.exe!_onexit
TBForm.exe!atexit
TBForm.exe!boost::re_detail::`dynamic initializer for 'block_cache''()
[Managed to Native Transition]
TBForm.exe!_initterm
TBForm.exe!<CrtImplementationDetails>::LanguageSupport::InitializeNative()
TBForm.exe!<CrtImplementationDetails>::LanguageSupport::_Initialize()
TBForm.exe!<CrtImplementationDetails>::LanguageSupport::Initialize()
TBForm.exe!?.cctor@@$$FYMXXZ()
其中TBForm.exe!boost::re_detail::`dynamic initializer for 'block_cache''()指向的位置是:
regex.cpp 195行:
#ifdef BOOST_HAS_THREADS
mem_block_cache block_cache = { 0, 0, BOOST_STATIC_MUTEX_INIT, }; ------>这一行
#else
mem_block_cache block_cache = { 0, 0, };
#endif
本来是用C++实现了功能的代码, 想用.net的Form来简化界面的编程, 因为功能的代码中用到了boost::regex, 程序一运行就出错, 根本就没有进入自己的代码中, 由于对.net不熟悉, 请教各位高手这是怎么回事, 如何解决或回避这个问题?
clr Boost RegEx C++ --------------------编程问答-------------------- VC.Net 不太懂,建议用C#写,可以用Dllimport引用C++。 --------------------编程问答-------------------- vc2010的stl里已经有regex的实现,但vc2008还没有, 但是我现在使用的都是vc2008,
vc2010stl的regex头文件包含不会出现这个问题。
有谁知道如何解决吗? --------------------编程问答-------------------- 没有用过boost。具体的解决方案没有
不过msdn里面有说,混合程序集使用静态变量会引起程序的死锁。
最好把静态变量放在
#pragma unmanaged 中。
--------------------编程问答-------------------- 暂时用VC2010的stl绕开这个问题, 但这样也使用不了Stlport了, 不知道如何能解决这个问题.
我尝试过把boost的
mem_block_cache block_cache = { 0, 0, BOOST_STATIC_MUTEX_INIT, }; ------>这一行
#else
mem_block_cache block_cache = { 0, 0, };
#endif
全局变量变成函数里的静态变量,像
mem_block_cache& getMemBlockCache()
{
#if ...
static mem_block_cache block_cache = { 0, 0, BOOST_STATIC_MUTEX_INIT, }; ------>这一行
#else
static mem_block_cache block_cache = { 0, 0, };
#endif
return block_cache;
}
启动时过了, 但运行时又在boost的另一处静态变量出错, 就放弃了.
补充:.NET技术 , VC.NET