VS链接器工具错误 LNK2019:无法解析的外部符号

2023-05-16

常见的问题

以下是一些导致 LNK2019 的常见问题:

  • 未链接的对象文件或包含符号定义的库。 在 Visual Studio 中,验证包含定义源代码文件是生成,分别链接为项目的一部分。 在命令行中,验证编译时包含定义的源文件,并且所生成对象文件包含在要链接的文件列表。

  • 符号的声明不拼写与符号的定义相同。 验证在声明和定义,使用正确的拼写和大小写,并且是使用或调用该符号的任何位置。

  • 使用一个函数,但数量的参数的类型与函数定义不匹配。 函数声明必须匹配定义。 验证函数调用是否匹配声明以及声明是否匹配定义。 调用模板函数的代码还必须拥有包括与定义相同的模板参数的匹配模板函数声明。 模板声明不匹配的示例,请参阅示例 LNK2019e.cpp 示例部分中。

  • 声明但未定义的函数或变量。 这通常意味着在标头文件中,存在声明,但不匹配定义实现。 对于成员函数或静态数据成员,实现必须包括类范围选择器。 有关示例,请参见 Missing Function Body or Variable。

  • 调用约定是函数声明和函数定义之间的差异。 调用约定 (__cdecl、 __stdcall、 __fastcall、 or __vectorcall) 作为修饰名称的一部分进行编码。 验证调用约定是否相同。

  • 符号定义在 C 文件中,但未使用 extern"C"在 c + + 文件中进行声明。 在作为 C 编译的文件中定义的符号拥有与在 C++ 文件中声明的符号不同的修饰名称,除非使用了 extern "C" 修饰符。 验证声明是否匹配每个符号的编译链接。

    同样,如果在 C 程序将使用的 C++ 文件中定义符号,请在定义中使用 extern "C" 。

  • 一个符号是定义为静态,然后更高版本在文件外部引用。 与 C 不同,在 C++ 中, 全局常量 拥有 static 链接。 若要避开此限制,你可以在头文件中包括 const 初始化并将该标头包括在你的 .cpp 文件中,或者你可以让变量成为非常量并使用常量引用来访问它。

  • 未定义一个类的静态成员。 静态类成员必须拥有唯一的定义,否则它将违反单个定义规则。 无法以内联方式定义的静态类成员必须通过使用其完全限定名称在一个源文件中进行定义。 如果没有进行定义,那么链接器会生成 LNK2019。

  • 生成依赖项仅定义为解决方案中项目依赖项。 在 Visual Studio的早期版本中,此级别的依赖项已经足够。 但是,从 Visual Studio 2010 开始, Visual Studio 要求 项目到项目引用。 如果你的项目没有项目到项目引用,那么你可能收到此链接器错误。 添加项目到项目引用以修复此错误。

  • 你通过使用 Windows 应用程序的设置生成了控制台应用程序。 如果错误消息是类似于WinMain 函数中引用的无法解析外部符号function_name,通过使用链接/subsystem: console而不是/SUBSYSTEM:WINDOWS。 有关此设置的详细信息以及如何在 Visual Studio 中设置此属性的说明,请参阅 /SUBSYSTEM (Specify Subsystem)。

  • 为在不同的源文件中内联的函数使用不同的编译器选项。 使用 .cpp 文件中定义的内联函数并在不同源文件中混合使用函数内联编译器可能会导致 LNK2019。 有关详细信息,请参阅 Function Inlining Problems。

  • 在其范围之外使用自动变量。 自动(函数范围)变量仅可在该函数的范围内使用。 这些变量不可声明为 extern ,也不能在其他源文件中使用。 有关示例,请参见 Automatic (Function Scope) Variables。

  • 调用内部函数,或将参数类型传递到目标体系结构不支持的内部函数。 例如,如果你使用 AVX2 内部函数,但未指定 /ARCH:AVX2 编译器选项,那么编译器会假定该内部函数是外部函数。 编译器不会生成内联指令,相反,它会生成一个对与内部函数同名的外部符号的调用。 当链接器尝试找到此缺失函数的定义时,它会生成 LNK2019。 验证是否只使用了目标体系结构支持的内部函数和类型。

  • 混合的代码不使用本机 wchar_t 的代码。 在 Visual C++ 2005 中完成的 C++ 语言一致性工作让 wchar_t 成为默认本机类型。 你必须使用 /Zc:wchar_t- 编译器选项来生成兼容使用 Visual C++ 早期版本进行编译的库和对象文件的代码。 如果并非所有文件都已经使用相同的 /Zc:wchar_t 设置进行编译,那么类型引用可能不会解析为兼容的类型。 验证所有库和对象文件中的 wchar_t 类型是否兼容,方法是更新使用的类型或在编译时使用一致的 /Zc:wchar_t 设置。

实际遇到的问题
1.在创建工程的时候,选择了Win32项目,然后选择了控制台应用程序时,链接时会出现错误:
LNK2019无法解析的外部符号 _WinMain@16,该符号在函数 "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) 中被引用
解决方法:链接器>>系统>>子系统>>窗口(/SUBSYSTEM:WINDOWS)改为控制台(SUBSYSTEM:CONSOLE)
2.在cpp文件中,如果存在C定义的符号,例如:#pragma comment(lib, avutil.lib) ,要将其放在extern "C"内
参考地址:https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=ZH-CN&k=k(LNK2019)&rd=true
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VS链接器工具错误 LNK2019:无法解析的外部符号 的相关文章

  • 服务器使用笔记本网络连接外网

    由于服务器经常部署在机房 xff0c 并没有外网 xff0c 连不上外网 需要使用自己笔记本的网络供服务器使用 笔记本连接手机热点 xff0c 再分享给服务器 一 首先 xff0c 需要把服务器和笔记本连接到同一网络内 xff0c 可以选择
  • grafana接入openldap认证

    首先两个文件开启ldap的支持 文件1 xff1a etc grafana grafana ini auth ldap enabled 61 true config file 61 etc grafana ldap toml allow s

随机推荐

  • Wireshark的常见提示

    概述 本文主要介绍Wireshark中出现的一些常见提示 详细信息 Wireshark简介 Gerald Combs是堪萨斯城密苏里大学计算机科学专业的毕业生 1998年发布了第一版Ethereal工具 xff0c Ethereal工具使用
  • shell报错bad substitution 解决办法

    bin bash a 61 34 hello 34 b 61 34 hi is a 34 echo b echo a echo a echo a 1 2 执行脚本方式不同出现的结果不同 xff1a 方式1 xff1a sh shell sh
  • centos8软件安装dnf命令

    DNF是新一代的rpm软件包管理器 它首先出现在 Fedora 18 这个发行版中 而目前 xff0c 它取代了yum xff0c 正式成为从 Fedora 22 起 Fedora 版本的包管理器 DNF包管理器克服了YUM包管理器的一些瓶
  • 多目标规则在 Makefile 中的应用与示例

    在 Makefile 中 xff0c 如果一个规则有多个目标 xff0c 而且它们之间用空格分隔 xff0c 我们称之为 34 多目标规则 34 这意味着这个规则适用于列出的所有目标 在目标下面的命令是 C 64 xff0c 它通常与 ma
  • 计算机中内存、cache和寄存器之间的关系及区别

    1 寄存器是中央处理器内的组成部份 寄存器是有限存贮容量的高速存贮部件 xff0c 它们可用来暂存指令 数据和位址 在中央处理器的控制部件中 xff0c 包含的寄存器有指令寄存器 IR 和程序计数器 PC 在中央处理器的算术及逻辑部件中 x
  • dell 台式电脑设置每天定时开机和关机

    每天定时开机设置 xff1a 戴尔电脑通过CMOS设置实现自动开机的设置过程如下 xff1a 1 首先进入 CMOS SETUP 程序 大多数主板是在计算机启动时按DEL或F2键进入 xff1b 2 然后将光条移到 Power Manage
  • windows批处理自动获取电脑配置信息

    39 2 gt nul 3 gt nul amp cls amp 64 echo off 39 amp rem 获取本机系统及硬件配置信息 39 amp set 61 Any question amp set 64 61 WX amp se
  • Centos7搭建cisco ocserv

    一 安装的部分直接yum安装即可 yum y install ocserv 二 配置文件根据实际情况调整 auth方式有两种 1 系统账号认证 配置的话就是 xff1a auth 61 34 pam 34 2 本地文件认证 配置的话就是 x
  • 私有harbor部署(docker方式)

    环境准备 docker compose v Docker Compose version v2 14 2 wget https github com docker compose releases download v2 14 2 dock
  • ORACLE扩展表空间

    一 查询表空间使用情况 SELECT UPPER F TABLESPACE NAME 34 表空间名 34 D TOT GROOTTE MB 34 表空间大小 M 34 D TOT GROOTTE MB F TOTAL BYTES 34 已
  • Oracle 常用性能监控SQL语句

    1 查看表锁 SELECT FROM SYS V SQLAREA WHERE DISK READS gt 100 2 监控事例的等待 SELECT EVENT SUM DECODE WAIT TIME 0 0 1 34 Prev 34 SU
  • Nginx出现“ 413 (499 502 404) Request Entity Too Large”错误解决方法

    1 Nginx413错误的排查 修改上传文件大小限制 在使用上传POST一段数据时 xff0c 被提示413 Request Entity Too Large xff0c 应该是nginx限制了上传数据的大小 解决方法就是 打开nginx主
  • 查看弹出广告来自哪个软件

    打开VS的Spy 43 43 将指针移到广告处 xff0c 然后点OK xff0c 在Process标签页可以看到进程id和线程id将获得的16进制进程id xff08 例如 xff1a 000025F8 xff09 通过计算器转成10进制
  • C++多态虚函数实现原理,对象和虚函数表的内存布局

    基本概念 我们知道C 43 43 动态多态是用虚函数实现的 xff0c 而虚函数的实现方式虽说C 43 43 标准没有要求 xff0c 但是基本都是用虚函数表实现的 xff08 编译器决定 xff09 所以我们有必要了解一下虚函数表的实现原
  • C++ STL中递归锁与普通锁的区别

    在多线程编程中 xff0c 保护共享资源的访问很重要 xff0c 为了实现这个目标 xff0c C 43 43 标准库 xff08 STL xff09 中提供了多种锁 xff0c 如std mutex和std recursive mutex
  • VS+Qt开发环境

    VS Qt下载 VS下载 xff1a https visualstudio microsoft com zh hans vs Qt下载安装 xff1a https www bilibili com video BV1gx4y1M7cM VS
  • windows下使用ShiftMediaProject编译调试FFmpeg

    为什么要编译FFmpeg xff1f 定制模块调试源码 windows下编译 推荐项目ShiftMediaProject FFmpeg 平时总是看到一些人说windows下编译FFmpeg很麻烦 xff0c 这时候我就都是微微一笑 xff0
  • RTSP分析

    RTSP使用TCP来发送控制命令 xff08 OPTIONS DESCRIBE SETUP PLAY xff09 xff0c 因为TCP提供可靠有序的数据传输 xff0c 而且TCP还提供错误检测和纠正 RTSP的报文格式可以参考HTTP的
  • RTP分析

    参考 RTP xff08 A Transport Protocol for Real Time Applications 实时传输协议 xff0c rfc3550 xff09 RTP Payload Format for H 264 Vid
  • VS链接器工具错误 LNK2019:无法解析的外部符号

    常见的问题 以下是一些导致 LNK2019 的常见问题 xff1a 未链接的对象文件或包含符号定义的库 在 Visual Studio 中 xff0c 验证包含定义源代码文件是生成 xff0c 分别链接为项目的一部分 在命令行中 xff0c