升级到 Windows 11 并重建 boost 后,Boost 日志链接器错误(LNK2001/LNK2019 未解析的外部符号)

Boost log linker errors (LNK2001/LNK2019 unresolved external symbol) after upgrading to Windows 11 and rebuilding boost

我编译了 boost 并正在处理我的 Visual Studio 2022 项目。升级 PC 并将 OS 更改为 Windows 11 后,我尝试重新构建 boost 并将其用于同一项目。现在我收到链接器错误,似乎我已经尝试了在线发布的所有建议的修复程序。不知何故,似乎找不到 lib 文件,即使我已经确认 include 和 lib 目录已正确包含,并尝试使用许多不同的配置重建 boost。

boost 构建生成 libboost_*.lib 文件,例如

libboost_log_setup-vc143-mt-gd-x32-1_78.lib

libboost_log_setup-vc143-mt-x32-1_78.lib

libboost_log-vc143-mt-gd-x32-1_78.lib

libboost_log-vc143-mt-x32-1_78.lib

这是我的增强构建选项

x86

b2 -j 16 --stagedir=stage/Win32 threading=multi --toolset=msvc-14.3 link=static runtime-link=shared --build-type=complete architecture=x86 address-model=32

x64

b2 -j 16 --stagedir=stage/x64 threading=multi --toolset=msvc-14.3 link=static runtime-link=shared --build-type=complete architecture=x64 --address-model=64

还有我的 Visual Studio 属性

C/C++->常规->附加包含目录

C:\Program Files\Code Libraries\boost\boost_1_78_0

链接器->常规->附加库目录

C:\Program Files\Code Libraries\boost\boost_1_78_0\stage$(Platform)\lib

下面是错误示例

1>Logging.obj : error LNK2019: unresolved external symbol "private: static unsigned int __cdecl boost::log::v2s_mt_nt62::attribute_name::get_id_from_string(char const *)" (?get_id_from_string@attribute_name@v2s_mt_nt62@log@boost@@CAIPBD@Z) referenced in function "public: __thiscall boost::log::v2s_mt_nt62::attribute_name::attribute_name(char const *)" (??0attribute_name@v2s_mt_nt62@log@boost@@QAE@PBD@Z)
1>Logging.obj : error LNK2001: unresolved external symbol "public: static void __cdecl boost::log::v2s_mt_nt62::aux::stream_provider<char>::release_compound(struct boost::log::v2s_mt_nt62::aux::stream_provider<char>::stream_compound *)" (?release_compound@?$stream_provider@D@aux@v2s_mt_nt62@log@boost@@SAXPAUstream_compound@12345@@Z)
1>Logging.obj : error LNK2019: unresolved external symbol "public: static void * __cdecl boost::log::v2s_mt_nt62::attribute::impl::operator new(unsigned int)" (??2impl@attribute@v2s_mt_nt62@log@boost@@SAPAXI@Z) referenced in function "class boost::log::v2s_mt_nt62::attribute_value __cdecl boost::log::v2s_mt_nt62::attributes::make_attribute_value<unsigned int &>(unsigned int &)" (??$make_attribute_value@AAI@attributes@v2s_mt_nt62@log@boost@@YA?AVattribute_value@123@AAI@Z)
1>Logging.obj : error LNK2019: unresolved external symbol "public: static void __cdecl boost::log::v2s_mt_nt62::attribute::impl::operator delete(void *,unsigned int)" (??3impl@attribute@v2s_mt_nt62@log@boost@@SAXPAXI@Z) referenced in function __unwindfunclet$??$make_attribute_value@AAI@attributes@v2s_mt_nt62@log@boost@@YA?AVattribute_value@123@AAI@Z[=12=]

编辑:我还想提及 Debug/Win32

的预处理器变量

WIN32 _DEBUG _CONSOLE WIN32_LEAN_AND_MEAN _WIN32_WINNT=0x0A00

我没能找到 Windows 11 的 _WIN32_WINNT 值,我想这可能是问题所在。但我不完全确定这是否重要。

问题是 Boost,尤其是 Boost.Log,是为不同的 Windows 版本构建的。您需要:

  • Build Boost _WIN32_WINNT 定义为您在构建代码时定义的相同版本。
  • 定义 BOOST_USE_WINAPI_VERSION 将您的代码构建到 Windows 版本 Boost 应该定位,这将低于您的 _WIN32_WINNT。在构建 Boost 时,还要为该版本定义 _WIN32_WINNTBOOST_USE_WINAPI_VERSION 宏。

要在构建 Boost 时定义宏,请将 define=macro=value 添加到 b2 命令行。例如,define=_WIN32_WINNT=0x0A00.