LNK2001: unresolved external symbol __imp___std_init_once_begin_initialize 解决
文章目录
- 问题背景
- 方法一:使用预编译指令
- 方法二:使用相同的环境
- 参考链接
- 附录
问题背景
Visual Studio 2019 对 CMakeLists.txt 的支持不是很好,使用 “文件 (File)” → “打开 (Open)” → “CMake…” 方式打开工程代码
链接同样使用 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 |