【问题标题】:boost link error LNK2038: “boost_log_abi” “v2s_mt_nt6” doesn't match “v2_mt_nt6"提升链接错误 LNK2038:“boost_log_abi”“v2s_mt_nt6”与“v2_mt_nt6”不匹配
【发布时间】:2018-05-09 15:41:02
【问题描述】:

这个链接错误是什么意思?以及如何解决它

error LNK2038: “boost_log_abi” “v2s_mt_nt6” doesn't match  “v2_mt_nt6"

我试过了

  ADD_DEFINITIONS(-DBOOST_ALL_DYN_LINK)
  ADD_DEFINITIONS(-DBOOST_LOG_DYN_LINK)
  ADD_DEFINITIONS(-DBOOST_USE_WINAPI_VERSION=0x601)

【问题讨论】:

  • 我在使用 b2 构建 boost 时没有定义 BOOST_LOG_DOXYGEN_PASS,为什么它是 v2s_mt_nt6 而不是 v2_mt_nt6
  • 您能否分享更多有关如何设置构建的上下文(您链接的文件,或实际失败的构建命令)?我怀疑你链接的是静态构建的 Boost 版本,但我需要更多数据来支持它
  • 我下载了一个预构建版本的 boost,现在它可以工作了,我在从 boost 源代码构建生成动态库时遇到了一些错误。非常感谢。
  • 所以v2s_mt_nt6 中的s 表示静态?
  • 是的。有可能您的 boost 构建实际上最终生成了静态库 - 对于其中的许多,您不会注意到差异,但是 Boost.Log 会引起麻烦。我会将其发布为答案,以便其他人在搜索时可以找到它。

标签: c++ windows boost visual-studio-2015


【解决方案1】:

您的 Boost.Log 库似乎是使用与您的主程序不同的标志构建的。

config.hpp,我们可以看到这些 ABI 名称的含义:

  • v2s_mt_nt6 静态链接,支持多线程,在 Windows Vista 或更高版本(版本 6)上

  • v2_mt_nt6 在 Windows Vista 或更高版本(版本 6)上动态链接,支持多线程

BOOST_LOG_DLL 宏决定使用两个路径中的哪一个。如果定义了BOOST_LOG_DYN_LINKBOOST_ALL_DYN_LINK 中的任何一个,则定义它。

如果您静态链接到 Boost.Log(通过 .lib 文件或类似文件),您不得定义这两个宏中的任何一个。1

这意味着您可以删除额外的预处理器定义(因为您正在尝试链接到静态库)或使用 Boost 的动态库版本(例如,请参阅here,了解如何在 Windows 上进行设置) .


1 注意一些库ignore those flags outright。如果这些宏配置错误

,Boost.Log 似乎是少数几个实际导致问题的之一

【讨论】:

    猜你喜欢
    • 2016-06-24
    • 2014-12-06
    • 2012-10-29
    • 1970-01-01
    • 2021-12-23
    • 2018-05-05
    • 2011-05-02
    • 2018-04-19
    • 2021-01-29
    相关资源
    最近更新 更多