【问题标题】:Problems Linking boost log 1_60 with MinGw on Windows 7在 Windows 7 上将 boost log 1_60 与 MinGw 链接时出现问题
【发布时间】:2016-03-27 11:32:57
【问题描述】:

在升级到 boost 1.60.0 时,某些应用程序在 Windows 7 上使用 MinGw 4.9.2 构建时无法与 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 上使用 boost 1.59.0 和 MinGw 4.9.2 链接 OK,在 Fedora 23 上使用 boost 1.60.0 和 gcc 5.1.1 链接 OK。

boost asio 自 boost 1.58.0 以来没有改变。那么boost log 在 boost 1.59.0 和 boost 1.60.0 之间发生了哪些变化导致 Windows 上的 MinGw 链接失败?

【问题讨论】:

    标签: windows gcc boost boost-log


    【解决方案1】:

    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。如果您不想更改 Boost 所针对的 Windows 版本,您可以在构建应用程序时将 BOOST_USE_WINAPI_VERSION 定义为 0x0501,表示您希望 Boost 继续针对 XP,即使您的应用程序针对 7。

    【讨论】:

    • 谢谢@andrey,'Dependency Walker' 将版本显示为_ZN5boost3log9v2_mt_nt54core3getEv 并设置BOOST_USE_WINAPI_VERSION=0x0501 修复了构建。首先感谢您创建了如此出色的图书馆。我想在构建提升时设置BOOST_USE_WINAPI_VERSION=0x601,但应该怎么做?我可以在 `boost/detail/winapi/config.hpp' 中设置它,但我不想编辑你的文件。我可以在 building boost 时将宏传递给 b2 吗?
    • 您可以像指定其他 config macros 一样执行此操作 - 通过将 define=BOOST_USE_WINAPI_VERSION=0x0601 添加到 b2 命令行。
    • 我尝试添加define=BOOST_USE_WINAPI_VERSION=0x0601 以及BOOST_USE_WINAPI_VERSION_WIN32_WINNT 的其他一些组合,但没有一个对我有用。编译 chrono 失败,因为未声明 GetTickCount64。从 boost/detail/winapi/config.hpp 中的 cmets 我可以看出问题在于我使用的是 MinGw(来自 QtCreator)而不是 MinGw64:只有 GetTickCountwinbase.h 中定义,所以我坚持设置 @ 987654344@ 直到 MinGw 更新...感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    相关资源
    最近更新 更多