升级BOOST 1.35至1.43的原因与__pRawDllMain(MFC相关)

问题描述:

在工作中,我们有一个建立了良好的1.35,但是当与1.43内建导致以下错误的MFC扩展DLL链接错误:升级BOOST 1.35至1.43的原因与__pRawDllMain(MFC相关)

error LNK2005: __pRawDllMain already defined in ApObs.obj 

如果我激活BOOST_LIB_DIAGNOSTIC老构建列表:

linking to lib file: libboost_thread-vc71-mt-gd-1_35.lib 

linking to lib file: libboost_thread-vc71-mt-gd-1_43.lib 

因此,没有瓒GE有与库被链接

完整的错误信息是:

libboost_thread-vc71-mt-gd-1_43.lib(tss_pe.obj) : error LNK2005: __pRawDllMain already defined in ApObs.obj 

我已经做tss_pe.cpp一个差异在这两个库的版本,它们是相同的,所以我不知道是什么问题是。

你可以通过定义BOOST_THREAD_USE_DLL来让消息消失,但是之后我们需要运送BOOST_THREAD-VC71-MT-GD-1_43.DLL,所以我不认为这是最好的解决方案。

+0

你提到1.36的两倍,b链接器输出说1.35? – 2012-09-02 03:18:39

+0

谢谢,更正 – 2012-10-15 13:56:37

发生这种情况是因为链接顺序。
您可以通过手动添加其他依赖关系中的库来更改链接错误。
在我的情况下把libboost_thread-vc71-MT-GD-1_43.lib的相互冲突的lib之前解决了这个问题:

项目 - >属性 - >配置属性 - >链接器 - >输入 - >附加依赖

libboost_thread-VC80-MT-1_40.lib; mfcs80u.lib;%(AdditionalDependencies)

注意,在我的情况下,它与mfcs80u.lib冲突的

+0

我不再在那家公司,我想最终他们只是转移到DLL版本,但我认为你的答案是正确的,所以我会将它标记为 – 2018-01-16 10:58:16

MFC和静态链接的boost线程之间存在已知的不兼容问题,它们都试图挂接到DllMain来初始化东西。这已经在1.37版本中推出。

From the author of boost::thread:

If you can ensure that on_process_exit from boost/thread/detail/tss_hooks.hpp is called when the DLL is unloaded then you can patch libs/thread/src/win32/tss_pe.cpp to remove the use of _pRawDllMain.

(他建议使用DLL版本,虽然)。

目前似乎已经efforts,使这个补丁是不必要的,但显然无济于事到目前为止...

+0

从Boost 1.52开始[这是可能的](http://*.com/a/34769235/1969455)。 – 2016-10-06 11:13:25