7

在工作中,我们有一个使用 1.35 构建良好的 MFC 扩展 DLL,但使用 1.43 构建时会导致以下错误:

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

所以没有改变与哪个库链接

完整的错误信息是:

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 所以我认为这不是最好的解决方案。

4

2 回答 2

2

MFC 和静态链接的 boost Thread 之间存在已知的不兼容,两者都试图挂接到 DllMain 以初始化内容。这已在 boost 1.37 中引入。

来自 boost::thread 的作者:

如果您可以确保在卸载 DLL 时调用 boost/thread/detail/tss_hooks.hpp 中的 on_process_exit,那么您可以修补 libs/thread/src/win32/tss_pe.cpp 以删除对 _pRawDllMain 的使用。

(不过,他建议使用 DLL 版本。)

似乎一直在努力使这个补丁变得不必要,但到目前为止显然无济于事......

于 2012-09-02T03:02:22.313 回答
1

发生这种情况是因为链接顺序。您可以通过在Additional Dependencies
中手动添加库来更改链接错误。 在我的情况下,将 libboost_thread-vc71-mt-gd-1_43.lib 放在另一个冲突的库之前解决了问题:

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

libboost_thread-vc80-mt-1_40.lib;mfcs80u.lib;%(AdditionalDependencies)

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

于 2018-01-15T09:58:55.447 回答