VS报错无法解析的外部符号.....

news2024/11/26 6:02:07

VS报错无法解析的外部符号...       

     我们在使用VS编译器编写C代码运行时提示:严重性 代码 说明 项目 文件 行 禁止显示状态错误 LNK2019 无法解析的外部符号 _main,函数 “int __cdecl invoke_main(void)” (?invoke_main@@YAHXZ) 中引用了该符号 StudyCProject E:\VisualStudioProjects\StudyCProject\StudyCProject\MSVCRTD.lib(exe_main.obj) 1

可能的原因:

有多种方法会造成此错误。 所有这些方法都涉及引用链接器无法解析或无法查找其定义的函数或变量。 编译器可以识别未声明符号的情况,但无法判断未定义符号的情况。 这是因为定义可能位于不同的源文件或库中。 如果引用了未定义的符号,链接器会生成未解析的外部 (external) 符号错误。

1.如果是在写代码阶段就报错了,那一般是因为包含目录没有设置对,导致程序无法找到外部库的函数定义.

2.而如果是自定义的函数找不到,则需要检查一下函数的拼写是否正确,或者函数在cpp中实现时有没有在函数名前面加上类的定义域(即类名::)。还有特别需要注意的是,有时候自己定义的方法什么的都没有错,还是会报这个错误,及就是从定义可以跳转到声明,但是从声明跳转不到定义,编译器显示没有定义该函数,这个问题,也会报这个错误。

3.如果是运行时报错,常见的原因是你引用了某个库的函数,然后也正确添加了它的头文件路径,vs在写代码阶段可以找到这个函数的定义,但是,由于你没有添加或者正确设置这个库的lib或者dll路径的话,那么vs就会在运行时候报错无法解析的外部符号。

本人整理了一些报错的常见问题:

原因1:包含符号定义的源文件未编译

  在vs中,确保将定义的符号编译为项目的一部分,检查中间是否正确匹配的.obj文件。

举例:比如我在qt上画了一个界面,然后将其.h和.cpp文件,迁移到我的工程文件下,运行就会报错,原因是我没有编译这两个文件,比如我自己的ui文件 #include "my_show" 一般情况下,编译器会自己生成一个“ui_my_show”的文件,如果没有编译迁移过来的文件,编译器就会报错,无法找到#include"ui_my_show"源文件,运行的话就会报错,无法解析外部符号。。。

原因2:包含符号定义的目标文件或库没有链接。

在 VS 中,确保包含符号定义的对象文件或库作为项目的一部分链接。 在命令行上,确保要链接的文件列表包含对象文件或库。

原因3:符号声明与定义不符

这个原因包括:拼写不一致、使用的该函数,该函数的类型或数量与函数定义不匹配。又或者声明的函数没有定义。(及就是在.h文件中声明了,但是在.cpp文件中没有实现。)

原因4:未定义类的static成员

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

原因5:符号定义为 static,并随后在文件外部引用
不同于 C,在 C++ 中,全局常量 (constants) 具有 static 链接。 若要避开此限制,可以在头文件中包含 const 初始化,并在 .cpp 文件中包含该头文件,或者你可以使变量成为非 const 并使用 const 引用来进行访问。
原因6:未定义入口点

这个原因,要防止是不是将main()函数,写成mian()。

原因7:因模板类导致的LNK2019错误.

这个基于我们写代码,大多数会将.h和.cpp文件区分开,一个声明,一个定义。但是用到模板类的时候,大多数人还是会这样,这就造成LNK2019错误。

《C++编程思想》第15章(第300页)说明了原因: 
模板定义很特殊。由template<…> 处理的任何东西都意味着编译器在当时不为它分配存储空间,它一直处于等待状态直到被一个模板实例告知。在编译器和连接器的某一处,有一机制能去掉指定模板的多重定义。所以为了容易使用,几乎总是在头文件中放置全部的模板声明和定义。

类模板导致错误的解决办法:

1.在主函数包含头文件时将实现类模板的函数也包含进来。如模板类在func.cpp中实现,那么就要在主函数中添加#include"func.cpp".

2.将模板类的定义及就是将实现方法和声明一同写在头文件中。

3.在实现模板类的文件中调用一下模板类,给予模板类一个具体化。

原因8:由于内联函数引起的LNK2019,无法解析的外部符号。

这个原因和上面的模板类的情况有些类似。通常编写函数时,会把声明放到头文件(*.h)中,而把函数定义放在源文件(*.cpp)中,在其他源文件中使用时包含对应的头文件即可。
但是内联函数(inline)不要定义在cpp文件中,因为我们通常都是包含头文件,而编译器在编译时会对内联函数进行展开操作,但是编译器只能在包含的头文件里搜索函数的定义体,如果头文件只有声明,显然编译器不知道该如何展开,于是就出错了。

第一种:

/*类内定义实现的即为内联函数,inline要不要都无所谓*/
Class A{
public:
    int func(int a,int b){
        return a+b;
    }
};
/*func为内联函数*/

第二种:

/*类外定义实现的,类内声明可加可不加inline*/
Class A{
public:
    int func(int a,int b);
};
 
inline int func(int a,int b){
    return a+b;
}
 
/*很多资料所说定义应该放在源文件.cpp中,这是错误的,内联函数的定义应该放在头文件.h中*/

解决方法:内联函数类外定义的时候,定义应该和声明放在一起,都放在头文件.h中

原因9:属性页的配置平台和实际的运行平台是否一致:

原因10:还有一些无法加载上的依赖.lib

可以在头文件中直接添加进来。

#pragma comment(lib,"Rpcrt4.lib")

原因11:头文件问题

     这个问题一般很难发现,我还是在项目当中遇到,我是在qt中,写一个界面类,然后将ui 、头文件还有.cpp文件迁移到我的工程文件下,(vs环境配置好的情况下),结果报错,找了一圈原因没有找到,最后找到我所引入的头文件,我转到#include<QWidget>下(编译器不报错),结果发现在#include<QWidget>文件下,只有一行#include"qwidegt.h"文件。 于是我直接将#include"qwidegt.h"引入我的头文件中,结果就不报LNK2019,无法解析外部符号错误。这也可能是我库没有配置好的原因。就是说如果遇到无法解决的,可以尝试找找头文件的原因。

原因12:特殊原因 宏定义

 我们从贴上来的报错信息中可以看出,错误出现在PointCloudFilter类这里。于是,我们打开这个类的头文件,可以在开头的地方发现几行预处理代码,如下图所示。这是一个if_else的语句,大致意思是,如果定义了DLL_IMPLEMENT,则将DLL_API这个宏的值设置为输出dll文件,否则设置为输入dll文件。而这里,这个工程是要输出dll文件的,因此,我们需要在这些代码运行之前先定义好DLL_IMPLEMENT。
解决办法:就是要在vs 项目->属性->配置属性->C/C++->预处理器,加上DLL_IMPLEMENT宏定义。

总结:这是我当前遇到的所有关于LNK2019无法解析外部符号的问题,希望可以帮助到您,如有错误或者有补充,欢迎在评论区留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1048311.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

webstorm卸载安装新版本后启动报错

问题描述 ​ 卸载了之前的2020版本然后安装2023版&#xff0c;安装之后打开出现如上错误 ​ 解决办法 --- 安装以下软件并在上面下载webstorm 安装&#xff1a;JetBrains Toolbox App 推测&#xff1a;应该是旧版本未卸载干净

电脑突然提示mfc140u.dll丢失,缺失mfc140u.dll无法运行程序的解决方法

在当今信息化社会&#xff0c;电脑已经成为我们生活和工作中不可或缺的一部分。然而&#xff0c;随着技术的不断发展&#xff0c;电脑也会出现各种问题。其中&#xff0c;最常见的问题之一就是“mfc140u.dll丢失”。那么&#xff0c;当我们遇到这个问题时&#xff0c;应该如何解…

GAN学习笔记

1.原始的GAN 1.1原始的损失函数 1.1.1写法1参考1&#xff0c;参考2 1.1.2 写法2 where, G Generator D Discriminator Pdata(x) distribution of real data P(z) distribution of generator x sample from Pdata(x) z sample from P(z) D(x) Discriminator network G…

Redis key基本使用

查看key的数据类型 string 、hash等 type key 查看key是否存在 exist key1 查看key的有效期 -1&#xff1a;永不过期 -2&#xff1a;已过期 设置key过期时间 expire key seconds expireat key 日期 key移动到其它库 move key index redis 默认是16个库 0,1,2,…15 切换数据库【…

箱讯科技成功闯入第八届“创客中国”全国总决赛—在国际物流领域一枝独秀

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 2023年9月26日&#xff0c;第八届“创客中国”数字化转型中小企业创新创业大赛决赛在贵州圆满收官。 经过初赛、复赛、决赛的激烈角逐&#xff0c;箱讯科技与众多强劲对手同台竞技&#xff0c;最终凭借出…

ROS系统通过类定义实现数据处理并重新发布在另一话题

在实际应用中&#xff0c;经常需要在同一个节点内接受数据&#xff0c;在回调函数中将数据进行处理&#xff0c;再将新数据重新发布在另一个新话题上。 实现步骤&#xff1a; 1. 定义一个数据处理类SubscribeAndPublish&#xff0c;设置2个pub成员对象和1个sub成员对象为publ…

pip安装报错 RuntimeError:Python version 2.7 or 3.4+ is required——解决办法

使用pip install安装第三方库时报错&#xff0c;错误如下&#xff1a;本机安装的是python3.11&#xff0c;已经大于3.4了&#xff0c;但还是会报错。 1、原因 由于存在字符串比较的一个bug&#xff0c;在检查python版本时&#xff0c;会逐个字符进行比较&#xff08;4>1&a…

新手学PCB画板选什么软件

Protel、AD、PADS与Allegro的比较与选择 1.Protel 早期使用较多&#xff0c;现在已经不在流行&#xff0c;少部分工程师能在使用。 优点&#xff1a;1.对新人友好&#xff0c;容易上手&#xff0c;所以学校教学首选这个。2.对电脑要求配置低&#xff0c;一般的电路设计都能实…

Qt扩展-KDDockWidgets 的使用

KDDockWidgets 的使用 一、概述二、原理说明三、代码实例1. 项目简述2. 布局源码 一、概述 KDDockWidgets 的使用相对比较简单&#xff0c;建议直接参考 其提供的例子。 二、原理说明 在这种多窗口布局显示的使用最常用的就是这两个类&#xff0c; 也就是 MainWindow 和 Doc…

No127.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

SpringBoot RestControllerAdvice异常处理适配原理

在项目中我们经常通过RestControllerAdviceExceptionHandler一起来实现全局的异常处理。 以下是示例代码&#xff1a; package com.xulu.monitor.test;import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.Rest…

【面试题】2023前端面试真题之JS篇

前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 表妹一键制作自己的五星红旗国庆头像&#xff0c;超好看 世界上只有一种真正的英雄主义&#xff0c;那就是看清生活的真相之后&#xff0c;依然热爱生活。…

Shiro反序列化原理及完整复现流程(Shiro-550/Shiro-721)

一、Shiro简介 Apache Shiro是一个强大且易用的**Java安全框架,**能够用于身份验证、授权、加密和会话管理。Shiro拥有易于理解的API,您可以快速、轻松地获得任何应用程序——从最小的移动应用程序到最大的网络和企业应用程序。 二、环境准备 靶机IP地址&#xff1a;192.168…

【新版】系统架构设计师 - 未来信息综合技术

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 未来信息综合技术考点摘要信息物理系统CPS的体系架构CPS 的技术体系CPS应用场景 人工智能分类关键技术机器学习 机器人发展分类机器人4.0 边缘计算概念与特点边云协同安全应用场景 数字孪生关键技…

Facebook耐用号养成攻略!如何实现自动化高效养号

在跨境电商领域&#xff0c;Facebook 已经成为一个不可或缺的推广和营销平台。然而&#xff0c;想要在 Facebook 上取得成功&#xff0c;有一批耐用的 Facebook 账号是必不可少的。养出一批 Facebook 耐用号可以不仅可以大幅度提高推广效率&#xff0c;更能有效降低营销成本&am…

ISP图像信号处理——平场校正介绍以及C++实现

参考文章1&#xff1a;http://t.csdn.cn/h8TBy 参考文章2&#xff1a;http://t.csdn.cn/6nmsT 参考网址3&#xff1a;opencv平场定标 - CSDN文库 平场校正一般先用FPN(Fixed Pattern Noise)固定图像噪声校正,即暗场校正&#xff1b;再用PRNU(Photo Response Non Uniformity)…

c++颜色空间转换

c颜色空间转换 cvtColor函数标识符颜色空间转换的类型 cvtColor函数使用不同的标识符来表示颜色空间转换的类型。这些标识符通常位于OpenCV的cv命名空间中&#xff0c;并以cv::COLOR_作为前缀。以下是一些常用的cvtColor函数标识符&#xff1a; BGR到灰度&#xff1a; cv::CO…

JEP290深入学习

关键类的学习 ObjectInputFilter serialFilter字段的类型就是ObjectInputFilter&#xff0c;这个接口是一个函数接口&#xff08;可以对方法进行赋值&#xff09;&#xff0c;其中定义的抽象方法是&#xff1a; Status checkInput(FilterInfo filterInfo); 接受的参数类型F…

JavaSE 栈和队列

目录 1 栈 Stack1.1 概念1.2 实现1.3 Stack常见方法的使用1.4 前、中、后缀表达式 2 队列 Queue2.1 概念2.2 实现2.3 循环队列2.4 双端队列 3 Java中的栈和队列4 练习题4.1 括号匹配问题4.2 用队列实现栈4.3 用栈实现队列4.4 实现一个最小栈4.5 设计循环队列 1 栈 Stack 1.1 概…

LIMS实验室信息管理系统源码 基于计算机的数据处理技术、数据存储技术、网络传输技术、自动化仪器分析技术于一体

LIMS 是一个集现代化管理思想与基于计算机的数据处理技术、数据存储技术、网络传输技术、自动化仪器分析技术于一体&#xff0c;以实验室业务和管理工作为核心&#xff0c;遵循实验室管理国际规范&#xff0c;实现对实验室全方位管理的信息管理系统。 LIMS将样品管理、数据管理…