将 boost log 1_60 与 Windows 上的 MinGw 链接时出现问题 7

Problems Linking boost log 1_60 with MinGw on Windows 7

在 Windows 7 上使用 MinGw 4.9.2 构建时升级到 boost 1.60.0 some applications are failing to link with boost log

我收到以下 linker 错误:

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

boost 1.60.0 构建日志文件显示 boost log 和 boost log_setup 构建时没有任何错误或警告,包括它未能 link 的一些文件,例如:

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   

应用程序 link 可以在 Windows 7 上使用 boost 1.59.0 和 MinGw 4.9.2 并且 link 可以在 Fedora 上使用 boost 1.60.0 和 gcc 5.1.1 23.

boost asio hasn't changed since boost 1.58.0. So what's changed in boost log 在 boost 1.59.0 和 boost 1.60.0 之间导致 MinGw linking 在 Windows?

上失败

Boost.Log 可能是使用与您的应用程序不同的选项构建的,因此它具有不同名称的版本命名空间。查看 1.60 中带有 Dependency Walker and see the description. I suspect, the difference will be in the OS API component of the namespace, as the setup of the target Windows version has changed 的导出符号。您正在为 Windows 7 构建应用程序,而 Boost.Log 很可能是为 Windows XP 构建的。

当您发现差异时,您必须更正 Boost 构建选项并重建 Boost。例如。将目标 Windows 版本设置为 7,将 BOOST_USE_WINAPI_VERSION 定义为 0x0601。如果您不想更改 Boost 所针对的 Windows 版本,您可以在构建应用程序时将 BOOST_USE_WINAPI_VERSION 定义为 0x0501,这表明您希望 Boost 继续以 XP 为目标,即使您的应用程序的目标是 7.