boost::thread ASSERT(AfxGetModuleState() != AfxGetAppModuleState()); // 在这一句发生断言错误

本文探讨了在使用Boost 1.38及1.45版本时,当MFC DLL项目中包含Boost.Thread库时出现的断言错误问题。通过修改Boost源代码能够解决该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用VC2008新建一个规则DLL(动态链接到MFC),然后啥也不干,就在其stdafx.h里引用一下boost的thread库:
#include "boost/thread.hpp"

在dll的头文件里导出一个啥也不干的函数:
extern "C" __declspec(dllexport) void DllFunc()
{

}

然后编译此dll项目,生成一个dll和一个lib。

另外新建一个的MFC对话框项目,隐式调用这个dll:

1) 引用dll的头文件
2) 用 #pragma comment(lib, "") 引入编译dll后产生的lib文件
3) 调用DllFunc()函数

调试方式运行,结果在窗口还没出现的时候报告断言错误:
(应该是还在加载该dll的时候就出错了)

void AFXAPI AfxCoreInitModule()
{
ASSERT(AfxGetModuleState() != AfxGetAppModuleState());  // 在这一句发生断言错误
// 查看到AfxGetModuleState()和AfxGetAppModuleState()的返回值都非空,但却是不同的值。
.
.
.
}

boost的版本是1.38.0
有没有人遇到过?为什么会这样呢?






我也碰到过与楼主一样的问题.


 boost::thread + MFC DLL 問題

基本上這個問題在boost 1.38就有了,只是沒想到更新成boost 1.45後問題還是沒有解決... 

如果是使用MFC开发程序 ,又剛好建立的MFC DLL工程中有使用boost::thread,就會發生compile正常但是一執行程式出現ASSERT。
dllinit.cpp,Line: 587,ASSERT(AfxGetModuleState() != AfxGetAppModuleState());

解決方法就是到boost/libs/thread/src/win32/tss_pe.cpp裡
把底下的程式碼註解掉(即把下面的那句代码注释掉.)
extern BOOL (WINAPI * const _pRawDllMain)(HANDLE, DWORD, LPVOID)=&dll_callback;

再重新compile boost問題就解決了.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值