2015-12-21 125 views
2

鏈接升壓日誌1_60使用MinGW在升級到boost 1.60.0一些應用程序失敗與boost log鏈接時使用MinGW 4.9.2在Windows 7問題在Windows 7

建我得到下面的連接錯誤:

undefined reference to `_imp___ZN5boost3log9v2_mt_nt67trivial6logger3getEv' 
undefined reference to `_imp___ZN5boost3log9v2_mt_nt63aux15stream_providerIcE17allocate_compoundERNS1_6recordE' 
undefined reference to `_imp___ZN5boost3log9v2_mt_nt63aux25unhandled_exception_countEv' 
undefined reference to `_imp___ZN5boost3log9v2_mt_nt611record_view11public_data7destroyEPKS3_' 
bad reloc address 0x1 in section `.text$_ZNK5boost4asio5error6detail13misc_category4nameEv[__ZNK5boost4asio5error6detail13misc_category4nameEv]' 

注:BOOST_LOG_DYN_LINK定義:

g++ -c -pipe -fno-keep-inline-dllexport -Wall -Wextra -Wpedantic -Ofast -std=c++1y -frtti -fexceptions -mthreads -DUNICODE -DLOGGING_ENABLED -DNTDDI_VERSION=NTDDI_WIN7 -D_WIN32_WINNT=_WIN32_WINNT_WIN7 -DBOOST_THREAD_USE_LIB=1 -DBOOST_LOG_DYN_LINK=1 

升壓1.60.0生成日誌文件顯示,這兩個升壓日誌和提高log_set建起來沒有任何錯誤或警告,包括一些它的失敗與如鏈接文件:

gcc.compile.c++ bin.v2\libs\log\build\gcc-mingw-4.9.2\release\threading-multi\trivial.o 
gcc.compile.c++ bin.v2\libs\log\build\gcc-mingw-4.9.2\release\threading-multi\unhandled_exception_count.o 

的應用程序在Windows 7上鍊接OK使用升壓1.59.0使用MinGW 4.9.2,並關聯OK使用使用gcc 5.1.1在Fedora 23上升壓1.60.0。

boost asio自升壓1.58.0以來沒有改變。那麼在升壓1.59.0和升壓1.60.0之間boost log中發生了什麼變化,導致MinGw鏈接在Windows上失敗?

回答

4

Boost.Log可能使用與應用程序不同的選項構建,因此它具有不同名稱的版本命名空間。看看導出的符號Dependency Walker並查看description。我懷疑,差異將出現在名稱空間的OS API組件中,因爲目標Windows版本的設置在1.60中具有changed。您正在爲Windows 7構建應用程序,而Boost.Log很可能是爲Windows XP構建的。

當您找出差異時,您必須更正Boost建築選項並重建Boost。例如。將目標Windows版本設置爲7,將BOOST_USE_WINAPI_VERSION定義爲0x0601。如果您不想更改Windows版Boost的目標用戶,則可以在構建應用程序時定義BOOST_USE_WINAPI_VERSION0x0501,表明即使您的應用程序的目標爲7,Boost也要繼續定位XP。

+0

謝謝@andrey ,'Dependency Walker'顯示版本爲'_ZN5boost3log9v2_mt_nt54core3getEv',並設置'BOOST_USE_WINAPI_VERSION = 0x0501'修復版本。並感謝您首先創建這樣一個偉大的圖書館。 我想設置'BOOST_USE_WINAPI_VERSION = 0x601'同時建立提升,但應該怎麼做呢?我可以在'boost/detail/winapi/config.hpp'中設置它,但我不想編輯你的文件。我可以在[構建增強]的同時將宏傳遞給b2(http://www.boost.org/doc/libs/1_60_0/more/getting_started/windows.html)嗎? – kenba

+0

您可以按照您指定其他[config macros](http://www.boost.org/doc/libs/1_60_0/libs/log/doc/html/log/installation/config.html)的相同方式來執行此操作 - by在b2命令行中添加'define = BOOST_USE_WINAPI_VERSION = 0x0601'。 –

+0

我試着添加'define = BOOST_USE_WINAPI_VERSION = 0x0601'和其他一些'BOOST_USE_WINAPI_VERSION'和'_WIN32_WINNT'的組合,但都沒有爲我工作。它沒有編譯'chrono',因爲'GetTickCount64'沒有被聲明。根據你在'boost/detail/winapi/config.hpp'中的註釋,我可以看到問題是我正在使用'MinGw'(來自QtCreator)而不是'MinGw64':'只有'GetTickCount'在'winbase中定義。 h'所以我堅持設置'BOOST_USE_WINAPI_VERSION = 0x0501'直到'MinGw'更新...感謝您的幫助。 – kenba