升级到 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_WINNT
或 BOOST_USE_WINAPI_VERSION
宏。
要在构建 Boost 时定义宏,请将 define=macro=value
添加到 b2
命令行。例如,define=_WIN32_WINNT=0x0A00
.
我编译了 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_WINNT
或BOOST_USE_WINAPI_VERSION
宏。
要在构建 Boost 时定义宏,请将 define=macro=value
添加到 b2
命令行。例如,define=_WIN32_WINNT=0x0A00
.