2010-08-12 29 views
7

在工作中,我們有一個建立了良好的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

回答

0

發生這種情況是因爲鏈接順序。
您可以通過手動添加其他依賴關係中的庫來更改鏈接錯誤。
在我的情況下把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

1

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://stackoverflow.com/a/34769235/1969455)。 – 2016-10-06 11:13:25