2015-12-21 103 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