在Windows 7上将boost log 1_60与MinGw链接时出现问题
升级到Windows 7上使用MinGw 4.9.2构建时,某些应用程序无法链接到 我收到以下链接器错误:在Windows 7上将boost log 1_60与MinGw链接时出现问题,windows,gcc,boost,boost-log,Windows,Gcc,Boost,Boost Log,升级到Windows 7上使用MinGw 4.9.2构建时,某些应用程序无法链接到 我收到以下链接器错误: undefined reference to `_imp___ZN5boost3log9v2_mt_nt67trivial6logger3getEv' undefined reference to `_imp___ZN5boost3log9v2_mt_nt63aux15stream_providerIcE17allocate_compoundERNS1_6recordE' undefine
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_链接定义如下:
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
boost 1.60.0构建日志文件显示,boost log和boost log_安装程序在构建时均未出现任何错误或警告,包括一些无法链接的文件,例如:
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上使用boost 1.59.0与MinGw 4.9.2链接OK,在Fedora 23上使用boost 1.60.0与gcc 5.1.1链接OK
自boost 1.58.0以来没有任何变化。那么,boost 1.59.0和boost 1.60.0之间发生了什么变化,导致MinGw链接在Windows上失败呢?boost.Log可能是使用不同于您的应用程序的选项构建的,因此它具有不同的版本名称空间。使用查看导出的符号,并查看。我怀疑,不同之处在于名称空间的OS API组件,正如目标Windows版本在1.60中的设置一样。您正在为Windows 7构建应用程序,而Boost.Log很可能是为Windows XP构建的
识别差异时,必须更正Boost构建选项并重建Boost。例如,要将目标Windows版本设置为7,请使用WINAPI版本将其定义为
0x0601
。如果您不想更改Boost的目标Windows版本,您可以在构建应用程序时将Boost\u USE\u WINAPI\u version
定义为0x0501
,这表示您希望Boost继续以XP为目标,即使您的应用程序以7为目标。谢谢@andrey,“Dependency Walker”显示版本为\u ZN5boost3log9v2\u mt\u nt54core3getEv
,设置BOOST\u USE\u WINAPI\u version=0x0501
修复了构建。首先感谢您创建了这么一个伟大的图书馆。我想在构建BOOST时设置BOOST\u USE\u WINAPI\u VERSION=0x601
,但应该如何设置呢?我可以在“boost/detail/winapi/config.hpp”中设置它,但我不想编辑您的文件。我可以同时将宏传递给b2吗?您可以使用指定其他宏的相同方式来执行此操作-将define=BOOST\u USE\u WINAPI\u VERSION=0x0601
添加到b2命令行。我尝试了添加define=BOOST\u USE\u WINAPI\u VERSION=0x0601
和BOOST\u USE\u WINAPI\u VERSION
的一些其他组合,但没有为我工作。编译chrono
失败,因为未声明GetTickCount64
。从您在boost/detail/winapi/config.hpp
中的评论中,我可以看出问题在于我使用的是MinGw
(来自QtCreator)而不是MinGw64
:只有GetTickCount
在winbase.h
中定义,所以我一直坚持设置BOOST\u USE\u WINAPI\u VERSION=0x0501
,直到MinGw
更新为止。。。谢谢你的帮助。