一新建的MFC规则DLL里引用boost::thread,使用此dll时产生断言错误

DDGG 2010-04-14 12:23:52
用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
有没有人遇到过?为什么会这样呢?
...全文
707 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
roger_77 2011-11-18
  • 打赏
  • 举报
回复
我也碰到过与楼主一样的问题.

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問題就解決了.
「已注销」 2010-04-14
  • 打赏
  • 举报
回复
嗯,我没有VS,也没有MFC库。不过我用VC编译器时,关于date_time.hpp就遇到过不能放在stdafx.h里的问题。
之后证明是因为预编译头文件的原因。

这看起来很奇怪啊。
因为boost::thread只是对_beginthreadex的一个封装。
DDGG 2010-04-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 loaden 的回复:]

不要将boost的头文件放在stdafx.h中。
由于boost的实现大量使用模板,那么当使用预编译头文件时,会出现一些奇怪的问题。

你还可以取消预编译头文件,再重新编译,看是否正常。
[/Quote]

一样的,我把
#include "boost/thread.hpp"
从stdafx.h移到导出函数的.cpp里面,也是一样报断言错。不信你可以建个MFC规则DLL试一下,很简单的。
「已注销」 2010-04-14
  • 打赏
  • 举报
回复
不要将boost的头文件放在stdafx.h中。
由于boost的实现大量使用模板,那么当使用预编译头文件时,会出现一些奇怪的问题。

你还可以取消预编译头文件,再重新编译,看是否正常。
DDGG 2010-04-14
  • 打赏
  • 举报
回复
不过用LoadLibrary()显示加载dll时,断言错误的地方和前面不一样:

CWinApp::CWinApp(LPCTSTR lpszAppName)
{
if (lpszAppName != NULL)
m_pszAppName = _tcsdup(lpszAppName);
else
m_pszAppName = NULL;

// initialize CWinThread state
AFX_MODULE_STATE* pModuleState = _AFX_CMDTARGET_GETSTATE();
ENSURE(pModuleState);
AFX_MODULE_THREAD_STATE* pThreadState = pModuleState->m_thread;
ENSURE(pThreadState);
ASSERT(AfxGetThread() == NULL); // 这里断言失败!!AfxGetThread()有值
pThreadState->m_pCurrentWinThread = this;
ASSERT(AfxGetThread() == this);
m_hThread = ::GetCurrentThread();
m_nThreadID = ::GetCurrentThreadId();

// initialize CWinApp state
ASSERT(afxCurrentWinApp == NULL); // only one CWinApp object please
pModuleState->m_pCurrentWinApp = this;
ASSERT(AfxGetApp() == this);

// in non-running state until WinMain
m_hInstance = NULL;
m_hLangResourceDLL = NULL;
.
.
.
}
DDGG 2010-04-14
  • 打赏
  • 举报
回复
有没有手头有VS2008(SP1),而且在VS下用过boost的朋友帮忙试一下呢?会不会还是我这边的用法问题。。
DDGG 2010-04-14
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 taodm 的回复:]

不#include "boost/thread.hpp"就没问题啦?
[/Quote]

是的,当然,#include "boost/thread.hpp"的同时可能就引入了编译好的 libboost_thread-vc90-mt-gd-1_38.lib,光一个hpp可能没那么大能耐吧。但是boost的这头文件和编译好的lib都是公司版本库里久经考验没出过问题的。
taodm 2010-04-14
  • 打赏
  • 举报
回复
不#include "boost/thread.hpp"就没问题啦?
DDGG 2010-04-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 taodm 的回复:]

当然,因为事先问题被严重复杂化了呗。所谓技术债务迟早要还的。

你显式加载dll呢?
[/Quote]

不行,在调用LoadLibrary()的时候报和上面一样的断言错误。
taodm 2010-04-14
  • 打赏
  • 举报
回复
当然,因为事先问题被严重复杂化了呗。所谓技术债务迟早要还的。

你显式加载dll呢?
DDGG 2010-04-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 taodm 的回复:]

如果你不关心代码的完全可移植性,何苦上boost::thread。
即使在乎代码的完全可移植性,thread的封装也就百行代码。
[/Quote]

情况不是那么简单的。。我只是为了提问把问题简化了而已。实际这是一个已完成的项目,现在要转成DLL。。。
taodm 2010-04-14
  • 打赏
  • 举报
回复
如果你不关心代码的完全可移植性,何苦上boost::thread。
即使在乎代码的完全可移植性,thread的封装也就百行代码。

DDGG 2010-04-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 loaden 的回复:]

嗯,我没有VS,也没有MFC库。不过我用VC编译器时,关于date_time.hpp就遇到过不能放在stdafx.h里的问题。
之后证明是因为预编译头文件的原因。

这看起来很奇怪啊。
因为boost::thread只是对_beginthreadex的一个封装。
[/Quote]

是呀,非常的奇怪!我在网上也查了,没有人遇到和我完全一样的问题。难道用VS的都很少用boost?

24,860

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧