在Windows 7上,使用MinGw链接boost log 1_60存在问题。

6

在升级到boost 1.60.0时,一些使用MinGw 4.9.2编译的应用程序在Windows 7上与boost log链接失败。

我收到以下链接器错误:

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均无任何错误或警告,包括一些它无法链接的文件。例如:
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上使用MinGw 4.9.2和boost 1.59.0链接正常,并且在Fedora 23上使用gcc 5.1.1和boost 1.60.0链接正常。 boost asio自boost 1.58.0以来没有改变。那么,在boost 1.59.0和boost 1.60.0之间发生了什么变化,导致MinGw在Windows上链接失败?而boost log呢?
1个回答

9
Boost.Log 可能使用不同于您的应用程序的选项进行构建,因此它具有名称不同的版本命名空间。请使用 Dependency Walker 查看导出的符号,并查看 description。我怀疑命名空间的操作系统 API 组件存在差异,因为目标 Windows 版本的设置在 1.60 中已经 更改。您正在为 Windows 7 构建应用程序,而 Boost.Log 很可能是为 Windows XP 构建的。
当您确定差异后,您需要更正Boost构建选项并重新构建Boost。例如,要将目标Windows版本设置为7,请定义BOOST_USE_WINAPI_VERSION0x0601。如果您不想更改Boost针对的Windows版本,则可以在构建应用程序时将BOOST_USE_WINAPI_VERSION定义为0x0501,表示您希望Boost继续针对XP,即使您的应用程序针对7。

谢谢@andrey,“Dependency Walker”显示的版本为“_ZN5boost3log9v2_mt_nt54core3getEv”,设置“BOOST_USE_WINAPI_VERSION=0x0501”修复了问题。同时感谢您首先创建了这么棒的库。我想在构建Boost时将“BOOST_USE_WINAPI_VERSION=0x601”设置为默认值,但应该如何操作?我可以将其设置在“boost/detail/winapi/config.hpp”中,但我不想编辑您的文件。我能否在构建Boost时将宏传递给b2? - kenba
дљ†еПѓдї•йАЪињЗеЬ®b2еСљдї§и°МдЄ≠жЈїеК†define=BOOST_USE_WINAPI_VERSION=0x0601жЭ•жМЗеЃЪеЕґдїЦйЕНзљЃеЃПзЪДжЦєеЉПжЭ•еЃМжИРж≠§жУНдљЬгАВ - Andrey Semashev
我尝试添加 define=BOOST_USE_WINAPI_VERSION=0x0601 和其他一些 BOOST_USE_WINAPI_VERSION_WIN32_WINNT 的组合,但都没有成功。它在编译 chrono 时失败了,因为 GetTickCount64 没有被声明。从您在 boost/detail/winapi/config.hpp 中的评论中可以看出,问题是我正在使用 MinGw(来自QtCreator),而不是 MinGw64:只有 GetTickCountwinbase.h 中被定义。所以我只能将 BOOST_USE_WINAPI_VERSION=0x0501 设置为固定值,直到 MinGw 更新... 感谢您的帮助。 - kenba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接