码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 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…” 方式打开工程代码

    在这里插入图片描述

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

    LNK2001: unresolved external symbol __imp___std_init_once_begin_initialize
    LNK2001: unresolved external symbol __imp___std_init_once_complete
    
    • 1
    • 2

    一般出现 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
    
    • 1
    • 2
    • 3
    • 4

    注:关于 _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”
    
    • 1

    能看到 类似如下内容

    -----------------
    /ALTERNATENAME:__imp___std_init_once_begin_initialize=__imp_InitOnceBeginInitialize
    /ALTERNATENAME:__imp___std_init_once_complete=__imp_InitOnceComplete
    
    • 1
    • 2
    • 3

    这是应该自动转发到链接器的内容,出于某种原因未成功。目前这种方法是处理 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.01200
    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.31911
    Visual Studio 2017 version 15.51912
    Visual Studio 2017 version 15.61913
    Visual Studio 2017 version 15.71914
    Visual Studio 2017 version 15.81915
    Visual Studio 2017 version 15.91916
    Visual Studio 2019 RTW (16.0)1920
    Visual Studio 2019 version 16.11921
    Visual Studio 2019 version 16.21922
    Visual Studio 2019 version 16.31923
    Visual Studio 2019 version 16.41924
    Visual Studio 2019 version 16.51925
    Visual Studio 2019 version 16.61926
    Visual Studio 2019 version 16.71927
    Visual Studio 2019 version 16.8, 16.91928
    Visual Studio 2019 version 16.10, 16.111929
    Visual Studio 2022 RTW (17.0)1930
    Visual Studio 2022 version 17.11931
    Visual Studio 2022 version 17.21932
    Visual Studio 2022 version 17.31933
    Visual Studio 2022 version 17.41934
    Visual Studio 2022 version 17.51935
  • 相关阅读:
    Vue快速入门、Vue常用命令、Vue生命周期、Element快速入门、Element布局、Element组件
    vite + vue3 + ts配置《企业级项目》二次封装el-table、分页
    35. 搜索插入位置、Leetcode的Python实现
    极客日报:华为称不会退出海外市场;英伟达证实遭遇黑客攻击;TypeScript 4.6发布 | 极客头条
    数据库表设计(一):设计规范和命名规范
    Git——IDEA集成Git(详细)
    企业架构LNMP学习笔记28
    pandas读取csv数据、使用set_index函数把多个数据列转化为多层行索引(keys参数指定需要被转化的多个数据列列表、形成多层行索引)
    曲柄压力机的离合器和制动系统设计
    基于PHP的网上订餐平台系统VUE【源码论文】
  • 原文地址:https://blog.csdn.net/weixin_44488341/article/details/133353512
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号