包含<boost/thread.hpp>
后,我收到此异常:
First-chance exception at 0x7c812afb in CSF.exe: Microsoft C++ exception:
boost::exception_detail::clone_impl<boost::exception_detail::bad_alloc_> at memory location 0x0012fc3c..
First-chance exception at 0x7c812afb in CSF.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000..
我无法抓住它,在内存位置打破我带来了kernel32.dll,此时我无法说明发生了什么但似乎在程序结束后VS抛出异常并且VS能够捕获它。
测试用例:
#include <boost/thread.hpp>
int main()
{
return 0;
}
编译器命令行:
/I"I:\SophisPal\boost-1_43_0-vc10-32\include\boost-1_43" /Zi /nologo /W3 /WX- /O2 /Oi /Oy- /GL /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm- /EHsc /GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Fp"Release\Client.pch" /Fa"Release\" /Fo"Release\" /Fd"Release\vc100.pdb" /Gd /analyze- /errorReport:queue
链接器命令行:
/OUT:"C:\Documents and Settings\user\my documents\visual studio 2010\Projects\CSF\Release\Client.exe" /INCREMENTAL:NO /NOLOGO "I:\SophisPal\boost-1_43_0-vc10-32\lib\libboost_system-vc100-mt-1_43.lib" "I:\SophisPal\boost-1_43_0-vc10-32\lib\libboost_date_time-vc100-mt-1_43.lib" "I:\SophisPal\boost-1_43_0-vc10-32\lib\libboost_regex-vc100-mt-1_43.lib" "I:\SophisPal\boost-1_43_0-vc10-32\lib\libboost_thread-vc100-mt-1_43.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /MANIFEST /ManifestFile:"Release\Client.exe.intermediate.manifest" /ALLOWISOLATION /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"C:\Documents and Settings\user\my documents\visual studio 2010\Projects\CSF\Release\Client.pdb" /SUBSYSTEM:CONSOLE /OPT:REF /OPT:ICF /PGD:"C:\Documents and Settings\user\my documents\visual studio 2010\Projects\CSF\Release\Client.pgd" /LTCG /TLBID:1 /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:QUEUE
答案 0 :(得分:2)
这听起来像是Boost静态库和头文件之间的不匹配。你是如何安装boost的?你是否在机器上运行bootstrap.bat来构建它?编译后是否修改了boost头文件?您是否在VS 2008全局设置中将库目录引用引用到包含不同版本的boost库的目录?
换句话说,您是否尝试过使用bootstrap.bat编译的库进行干净安装,并删除了计算机上所有其他的boost实现?在你做完之前,你的工作基础不够坚实。
如果在此之后仍然遇到问题,您是否尝试过调试 - &gt;异常并打开第一次机会C ++和Win32异常,以便在调试器中看到调用堆栈?如果这不起作用,您是否尝试过使用Win32 API SetUnhandledExceptionFilter()
,传入一个使用MiniDumpWriteDump()
DBGHELP.DLL
API的回调来写出一个小型转储(* .dmp) )进程到文件,然后您可以使用VS 2010调试器进行事后调试?
答案 1 :(得分:1)
我建议尝试创建一个新的空Win32控制台应用程序(我通常也会检查“空项目”复选框,以免获得预编译的标题,以及小项目)。
将 .cpp 文件添加到项目中并将其提供给您。
在项目属性中,在 C / C ++ - &gt;下;一般,在其他包含目录框中,添加顶级Boost文件夹的路径(包含名为 boost 的文件夹的文件夹,该文件夹包含所有头文件)。就我而言,它是 z:\ dev \ boost_1_43_0 ;基于你的帖子,你的帖子可能是我:\ SophisPal \ boost-1_43_0-vc10-32 \ include \ boost-1_43 。
同样在项目属性中,在链接器 - &gt;下;常规,在其他库目录框中,添加包含已编译的Boost库的文件夹的路径。在我的电脑上,这是 z:\ dev \ boost_1_43_0 \ lib ;基于你的帖子,你的帖子可能是 I:\ SophisPal \ boost-1_43_0-vc10-32 \ lib 。
您无需明确告知链接器要链接的库; Boost标头使用Visual C ++ #pragma
指令之一告诉链接器需要使用哪些库。
只有这样,您应该能够构建和运行Debug和Release配置。我完成了这些步骤,没有任何问题。
如果可行的话,我会开始修改项目,一次一个选项,直到它与当前项目的配置相匹配。最终有些东西会让它停止工作,然后你会知道问题是什么。
如果不工作,我会考虑下载Boost源并重新构建它。
答案 2 :(得分:1)
一些想法:
你怎么知道在 main()之后崩溃?
如果从调试器运行并配置VS以捕获每个异常(不仅仅是未处理的),会发生什么?
你能发布崩溃的堆栈踪迹吗?
答案 3 :(得分:1)
你应该使用像VLD(Windows)或Valgrind(Linux)这样的内存分析器来检查它是否可以指向错误的分配,也许你有一个版本的Boost库包含与你的不兼容错误当前编译器,您可能必须应用修复程序。
答案 4 :(得分:1)
这是按照1.43的设计设计的,但自那以后一直在修复。有关详细信息,请参阅this thread。
答案 5 :(得分:1)
你有一个糟糕的构建或搞乱项目设置,因为你已经尝试创建一个新的基本项目,只是包括我建议重新编译提升的标题。您可以从source.org下载最新版本1.45,该文件链接自boost.org。当你在那里时,抓住最新的bjam。您可以从visual studio命令提示符运行以下命令,以构建64位和32位的增强:
bjam --build-type=complete --toolset=msvc-10.0 --stagedir=lib64 address-model=64 stage > x64-buildboost.log
RD bin.v2 /S /Q
bjam --build-type=complete --toolset=msvc-10.0 --stagedir=lib32 stage > x86-buildboost.log
RD bin.v2 /S /Q
另一方面,如果CSF参考文献提到英特尔的通信服务框架开源电话项目,那么我之前就已经开始进行升级,那个项目在当天恢复了更多的事情,而不是修复...公平警告。