LNK2001: unresolved external symbol __imp___std_init_once_begin_initialize 问题解决

LNK2001: unresolved external symbol __imp___std_init_once_begin_initialize 解决

文章目录

  • 问题背景
    • 方法一:使用预编译指令
    • 方法二:使用相同的环境
  • 参考链接
  • 附录

问题背景


Visual Studio 2019 对 CMakeLists.txt 的支持不是很好,使用 “文件 (File)” → “打开 (Open)” → “CMake…” 方式打开工程代码

LNK2001: unresolved external symbol __imp___std_init_once_begin_initialize 问题解决_第1张图片

链接同样使用 Visual Studio 2019 生成的静态库时出现了这个问题

LNK2001: unresolved external symbol __imp___std_init_once_begin_initialize
LNK2001: unresolved external symbol __imp___std_init_once_complete

一般出现 unresolved external symbol (无法解析的外部符号)表示编译器没有找到函数的实现,也就是函数体。

方法一:使用预编译指令


在 Visual Studio 开发者社区看到一个帖子是这样说的

Some functions in msvcprt.lib have been renamed at some point, and the linker is supposed to do the necessary redirection automatically for you. However, I assume that the redirection is not correctly seen by the linker anymore and thus not applied. You can add the necessary code anywhere in your own though.

在 msvcprt.lib 库中的一些函数在某次迭代更新后被重命名,链接器应该会自动执行必要的重定向。但是,实际情况是链接器并未找到正确的指令,因此未进行正确的重定向。不过,你可以在自己的代码中合适的位置添加如下必要的代码。

#if _MSC_VER >= 1932
#pragma comment(linker, "/alternatename:__imp___std_init_once_complete=__imp_InitOnceComplete")
#pragma comment(linker, "/alternatename:__imp___std_init_once_begin_initialize=__imp_InitOnceBeginInitialize")
#endif

注:关于 _MSC_VER 的版本对应问题见文章附录

我们使用 Visual Studio 的开发人员命令提示工具查看 msvcprt.lib 库的预处理指令 (dumpbin /directives

dumpbin /directives “C:\Program FilesMicrosoft Visual Studio\2022\Enterprise\VC\Tools\MSVC14.32.31326\libx64\msvcprt.lib”

能看到 类似如下内容

-----------------
/ALTERNATENAME:__imp___std_init_once_begin_initialize=__imp_InitOnceBeginInitialize
/ALTERNATENAME:__imp___std_init_once_complete=__imp_InitOnceComplete

这是应该自动转发到链接器的内容,出于某种原因未成功。目前这种方法是处理 Visual Studio 2022 初期版本的问题,后续的版本应该是修复了。

方法二:使用相同的环境


本人这里遇到的问题,原因是:两个 Visual Studio 的版本不一致,也就是编译静态库的开发环境和使用静态库的开发环境不一致,虽然都是 2019,但一个是 16.0.0 另一个是较新的版本,额外还安装了 Visual Studio 2022

然后使用同一版本的 Visual Studio 2019,就不再有此种链接问题。

参考链接


https://developercommunity.visualstudio.com/t/-imp-std-init-once-complete-unresolved-external-sy/1684365

https://learn.microsoft.com/en-us/cpp/preprocessor/predefined-macros

附录


Visual Studio 版本与 _MSC_VER 对应表

Visual Studio 版本 _MSC_VER
Visual Studio 6.0 1200
Visual Studio .NET 2002 (7.0) 1300
Visual Studio .NET 2003 (7.1) 1310
Visual Studio 2005 (8.0) 1400
Visual Studio 2008 (9.0) 1500
Visual Studio 2010 (10.0) 1600
Visual Studio 2012 (11.0) 1700
Visual Studio 2013 (12.0) 1800
Visual Studio 2015 (14.0) 1900
Visual Studio 2017 RTW (15.0) 1910
Visual Studio 2017 version 15.3 1911
Visual Studio 2017 version 15.5 1912
Visual Studio 2017 version 15.6 1913
Visual Studio 2017 version 15.7 1914
Visual Studio 2017 version 15.8 1915
Visual Studio 2017 version 15.9 1916
Visual Studio 2019 RTW (16.0) 1920
Visual Studio 2019 version 16.1 1921
Visual Studio 2019 version 16.2 1922
Visual Studio 2019 version 16.3 1923
Visual Studio 2019 version 16.4 1924
Visual Studio 2019 version 16.5 1925
Visual Studio 2019 version 16.6 1926
Visual Studio 2019 version 16.7 1927
Visual Studio 2019 version 16.8, 16.9 1928
Visual Studio 2019 version 16.10, 16.11 1929
Visual Studio 2022 RTW (17.0) 1930
Visual Studio 2022 version 17.1 1931
Visual Studio 2022 version 17.2 1932
Visual Studio 2022 version 17.3 1933
Visual Studio 2022 version 17.4 1934
Visual Studio 2022 version 17.5 1935

你可能感兴趣的:(Visual,Studio,操作,visual,studio,c++)