VS报错:error:LNK2005 _main 已经在 *.obj 中定义

应该是重定义了,但是又解决不了,看似又没有重定义啊,就在一个文件定义了啊?怎么会出现这种情况呢?关键是,编译报错,程序运行不了了。

这里提一下我的前期操作,是因为将一个头文件和源文件合并为一个头文件了,然后在主函数文件嵌入这个头文件。

一个解决办法:

vs2017错误:error:LNK2005 _main 已经在 *.obj 中定义 - 简书 (jianshu.com)

确实编译不报错,但是会警告可能会不执行。

......

试运行程序,没有问题。

应该是解决了。但总是不太放心,没有直接解决问题啊,到底哪里出问题了呢?

另外一些分析:

error:LNK2005 _main 已经在 *.obj 中定义_cmakecudacompilerld.cu.obj main已经在main.cpp.obj定义-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/yan_less/article/details/73149578

感觉很可能是这里面的变量没有用extern重新声明下。但是尝试在需要使用的文件将这些变量再extern一下,结果还是报错。看来不是这里的问题。

多次尝试,才发现问题。先说背景原因:

C编译,嵌入头文件,即include语句,意思就是拷贝对应头文件到嵌入的地方,如果头文件中对变量进行定义并初始化了。那么在嵌入头文件的文件,这些变量又会初始化,C不允许重复对一个变量定义并初始化,就会报这种重复定义的错误。

分析下我的程序结构:

看前期操作,是将一个源文件和头文件合并,写成一个头文件。然后在主程序文件include这个头文件。理论上,头文件定义的变量在主文件是可以用的,不会出现重定义这种问题,因为主文件也没再定义。但实际上,头文件中变量,只能声明,不能定义。如果定义了,那么在嵌入的主文件,编译时是将头文件定义的代码又拷贝到主文件,则会形成重定义。

所以,头文件最好是只声明。C中,变量的重复声明是没有任何问题的!

所以是这种合并操作导致的。要直接解决问题,则还是要将源文件和头文件分开写,且头文件不能定义,只能声明。

实际上,多年以来一直有个问题困扰我很久,总弄不明白,就是一般一个头文件对应一个源文件,但是,一些数据类型、宏定义等,在头文件中定义,在源文件中使用,同时,在其他文件也要使用,那么源文件必须嵌入这个头文件,其他文件也需要嵌入这个头文件。然后,一些变量,在源文件中定义,别的源文件需要使用,则,就需要在头文件中声明。所以,源文件和头文件是相互引用的关系?是不是应该定义两个头文件,一个头文件只定义源文件要用的数据类型、宏等,另一个头文件,提供源文件中其他文件需要使用的变量和函数的声明?其他文件在嵌入时,只需要嵌入后一个头文件?这样就解决了源文件和头文件相互引用的问题?

但是,如果其他文件还需要用第一个头文件定义的数据类型和宏呢?因为源文件中定义的一些其他文件需要使用的变量可能是基于这些数据类型和宏,那不是还要再嵌入第一个头文件?那不是很麻烦么???

现在就很好解决了。其实,只需要在头文件中变量声明时前面加extern关键字就可以了。这些变量,是在源文件中定义的,在头文件声明,其他源文件只需要嵌入头文件,即可使用。源文件虽然嵌入头文件,再次碰到这些变量声明,但是因为用了extern,可以忽略这些声明,而只使用本文件内定义,使用即可。

而头文件中声明(定义)的数据类型、宏,可以在源文件用,也可以在其他嵌入这个头文件的文件使用。其实,这些数据类型和宏,完全可以在源文件定义,然后在头文件再声明,和变量、函数是一样的处理。只不过,一般就不需要了,只需要在头文件定义,源文件引用即可。

完美!其实是应该开始学C就该搞清楚的问题,我现在才搞清楚,哎,就这样吧,因为可能很多人都一样,不会去注意这个问题,国内没有讲述清楚底层、内幕的风气,希望能帮到一些人吧。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

图像监视:在 Visual Studio 调试器中查看内存中图像

先决条件 本教程假定您具有以下可用项: 安装了 Update 1 的 Visual Studio 2012 Professional(或更高版本)。更新 1 可在此处下载。在 Windows 计算机上安装 OpenCV(教程:在 Windows 中安装)。能够在 Visua…

【Spring 篇】深入探索:Spring集成Web环境的奇妙世界

嗨,亲爱的小白们!欢迎来到这篇有关Spring集成Web环境的博客。如果你曾对如何在Spring中构建强大的Web应用程序感到好奇,那么这里将为你揭示Web开发的神秘面纱。我们将用情感丰富、语句通顺的文字,以小白友好的方式,一探…

survey和surveyCV:如何用R语言进行复杂抽样设计、权重计算和10折交叉验证?

一、引言 在实际调查和研究中,我们往往面临着样本选择的复杂性。复杂抽样设计能够更好地反映真实情况,提高数据的代表性和可靠性。例如,多阶段抽样可以有效地解决大规模调查的问题,整群抽样能够在保证样本的随机性的同时减少资源消…

D25XB100-ASEMI家用电器整流桥D25XB100

编辑:ll D25XB100-ASEMI家用电器整流桥D25XB100 型号:D25XB100 品牌:ASEMI 封装:GBJ-5(带康铜丝) 平均正向整流电流(Id):25A 最大反向击穿电压(VRM&…

thinkphp递归实现无限级子分类合并上级children

//设别分类列表public function getCategoryList(){$list = Db::name(categorys)->select(

玩转Mysql 七 (索引的创建与设计原则)

一、索引的创建与使用 1、索引的分类 MySQL的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。 (1)从 功能逻辑 上说,索引主要有 4 种,分别是普通索引、唯一索引、主键索引、全文索引。 (…

20_GC垃圾回收机制

文章目录 GC如何确定垃圾如何回收垃圾回收垃圾的时机 GC 如何确定垃圾 引用计数算法 给对象添加一个引用计数器,每当一个地方引用它时,计数器加1,每当引用失效时,计数器减少1,当计数器的数值为0时,也就是对…

Django教程|数据统计图表(echarts、highchart)

前言 highchart,国外。 echarts,国内。 本项目集成 hightchart和echarts图表库实现数据统计功能。 包括:折线图,柱状图,饼图和数据集图。 效果图 echats Highcharts 源代码 编写模板(Template&#x…

Docker安装Atlassian全家桶

文章目录 省流:1.docker-compose文件2.其他服务都正常启动,唯独Bitbucket不行。日志错误刚启动时候重启后查询分析原因再针对第一点排查看样子是安装的bitbucket和系统环境有冲突问题? 结论: 省流: bitbucket 只能安装…

idea使用ssh连接docker,并通过Dockerfile文件,直接在idea中启动docker应用,并进行远程debug

idea使用ssh连接docker,并通过Dockerfile文件,直接在idea中启动docker应用,并进行远程debug 第一步: idea通过ssh连接docker第二步:使用Dockerfile文件在远程启动应用第三步: 远程debug 容器运行的好处是减轻本地运行的负担(本地电…

数据结构初探:揭开数据结构奥秘

🌈个人主页:聆风吟 🔥系列专栏:数据结构、算法模板、汇编语言 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 📋前言一. 数组结构起源二. 基本概念和术语2.1 数据2.2 数据元素2.3 数据项2.4 …

Rust-语句和表达式

if-else Rust中if-else表达式的作用是实现条件分支。if-else表达式的构成方式为:以if关键字开头,后面跟上条件表达式,后续是结果语句块,最后是可选的else块。条件表达式的类型必须是bool。 if-else结构还可以当表达式使用 loop …

苹果手机怎么恢复备份?详细攻略为你整理好了!

随着智能手机和互联网的普及,手机中存储的个人信息、照片、视频、聊天记录等数据会变得越来越多。一旦手机丢失、损坏或系统出现问题,我们很可能会面临数据丢失的风险。因此,越来越多的人开始意识到保护手机数据的重要性。 当苹果手机数据丢…

Mnajora 使用deb包安装软件

说明 Mnajora 安装deb软件包主要有两种方式 可以使用dpkg 直接安装也可是使用debtap将deb软件包转换成 使用dpkg sudo pacman -S dpkg #安装dpkgsudo dpkg -i ###.deb #使用dpkg安装deb软件包和在ubuntu上是一样的 安装成功 使用debtap debtap是一个用于将.deb包转换为A…

C++力扣题目617--合并二叉树

给你两棵二叉树: root1 和 root2 。 想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠&#…

“+”连接符用法(Java)

""可以作为连接符使用,如果与字符串一起运算,结果依旧是一个字符串 比如"aaa"6 --> "aaa6" 在打印中,能算就算,不能计算的时候就会连接在一起 注意先后顺序 ascii编码: 字符串&…

VASP结合vaspkit+ShengBTE计算热电优值(一)

电导率σ,塞贝克系数S的计算: 使用vaspkit计算处对应的物理量,具体流程为: 准备好计算的材料对应的POSCAR。如果是二维材料可以使用vaspkit 的921或923功能对二维材料POSCAR进行标准化。进行结构优化。使用 vaspkit-681命令生成高…

卡尔曼滤波:理论与代码

卡尔曼滤波:理论与代码 引言 卡尔曼滤波是一种用于估计系统状态的优化技术,特别适用于含有噪声的测量数据和系统动态变化的情况。本文将简单探讨卡尔曼滤波的理论基础、数学公式的推导,并通过Python代码示例演示其在实际应用中的效果。 一…

python,序列的切片

序列的切片就是指从一个序列中取出子序列 语法: 序列[起始下标:结束下标:步长] 步长为1表示一个一个的取元素,步长为2表示每次跳过一个元素的取元素,步长为负数表示反向切片,取元素时取到结束下标&#…

养老数据监控大屏:护航金色晚年,打造智慧养老新标杆

随着老龄化社会的加速到来,养老服务的质量和效率成为了社会关注的焦点。如何运用现代科技手段提升养老服务水平,让老年人享受更加舒适、便捷的晚年生活,成为了我们面临的重要课题。在这一背景下,养老数据监控大屏应运而生&#xf…
最新文章