问题解决: multiple definition of XXX

2023-10-26

在编译程序的时候,遇到了一个问题,花点时间记录一下:

在Qt中创建一个类后,一般是先在.h文件中声明变量与函数,然后在对应的.cpp文件中对各个函数进行定义,这在往常使用中没有任何问题,今天在使用Qt时,在各.cpp源文件编译时出现了许多multiple definition of XXX的错误:

这里写图片描述

搜寻了网上一些资料,总算是解决multiple definition of 的方法:

问题解决方法之一:

根据网上的解释,multiple definition of 原因是因为在多次包含global.h时重复定义了变量和函数。问题是检查过程序后,发现并不存在重复定义的变量和函数,在一条论坛评论中尝试了一种简单粗暴的方法……以Qt项目为例,在项目的Debug文件夹中找到编译时生成的o文件,如:

这里写图片描述

c和c++编译.c,cpp文件,每个文件都生成.o文件,再把所有的.o文件链接成最后的执行程序,若o文件有问题,是无法生成执行文件的。将已存在的o文件删除之,重新编译并生成新的o文件,结果在没有其他问题的情况下成功生成执行程序。(我就是属于这种情况…在确认代码中已无明显错误时可以一试)

问题解决方法之二:

当多个文件包含同一个头文件时,并且你的.h文件里面没有加上条件编译。

而当多个文件包含同一个头文件时,而头文件中没有加上条件编译,就会独立的解释,然后生成每个文件生成独立的标示符。在编译器连接时,就会将工程中所有的符号整合在一起,由于,文件中有重名变量,于是就出现了重复定义的错误。

给每一个头文件加上条件编译,避免该文件被多次引用时被多次解释,这是个应该是习惯。这个方法会解决大部分低级问题。在创建Qt类时已默认生成条件编译:

#ifndef TEST_H
#define TEST_H
......
#endif

就会独立的解释,然后生成每个文件生成独立的标示符。在编译器连接时,就会将工程中所有的符号整合在一起,由于,文件中有重名变量,于是就出现了重复定义的错误。

因此可以给每一个头文件加上条件编译,避免该文件被多次引用时被多次解释,这是个应该是习惯。这个方法会解决大部分低级问题。

问题解决方法之三:

当以上方法无效时,可以把所有的全局变量放入一个头文件 global.h (名字随意起,但要加条件编译)中,每一个变量前面加extern,声明一下这些变量将在其它文件中定义。 然后建立一个和头文件名字对应的.c or .cpp文件 如global.c。在里面声明所有的全局变量。例如:void(*Handl_Display)();

然后,让涉及到全局变量的文件include ”global.h“。这样编译时,会先对global.c编译生成一个global.o ,然后再和其它文件的.o链接生成可执行文件。

在一篇文章: http://blog.csdn.net/wu070815/article/details/8781762 中提到的另一种解决方法:

在变量前加static,声明成静止变量。
这个方法虽然可以解决multiple definition的问题,但是却会引发其他问题。
问题如下:
三个文件,a.h,a.c,b.c;
在a.c和b.c 都include了a.h。
在b.c中调用a.c中的函数对a.h中的变量进行赋值,但事实上b.c中的变量仍没被赋值。
问题分析:
static的含义是迫使那个变量只在某个文件可见。 
假定你在头文件定义static x; 
且这个头文件分别被a.c和b.c包含;
实质是在a.c和b.c里会分别定义一个名字叫x的变量,两个x毫无关系。
在a.c里修改x,他不会导致b.c里的x变化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

问题解决: multiple definition of XXX 的相关文章

  • 从实体获取单列

    如何从查询中获取单个列而不是整个对象 我可以这样做来获取整个对象 但我想要的只是名称 IList
  • Nullable 是不可能的,为什么不呢? [复制]

    这个问题在这里已经有答案了 如果这是一个愚蠢的问题 请原谅 我正在尝试更好地理解 Net 中的 Nullable 类型 从我从 Microsoft 源代码 使用 ReSharper 中注意到的内容 我了解到 Nullable 是一个结构 而
  • EventHandler 应该始终用于事件吗?

    我一直在愉快地使用自定义委托类型和通用编写事件Action委托类型 没有真正考虑我在做什么 我有一些很好的扩展助手Action and EventHandler这使我倾向于使用那些预定义的委托类型而不是我自己的委托类型 但除此之外 除了惯例
  • .pdbs 会减慢发布应用程序的速度吗?

    如果 dll 中包含 pdb 程序调试 文件 则行号将出现在引发的任何异常的堆栈跟踪中 这会影响应用程序的性能吗 这个问题与发布与调试 即优化 无关 这是关于拥有 pdb 文件的性能影响 每次抛出异常时都会读取 pdb 文件吗 加载程序集时
  • 如何使用 C# 以编程方式编辑 Power BI Desktop 文档参数或数据源?

    我有一个在 Power BI Desktop 中内置的报告模板 并保存为 pbix 或 pbit 文件 该模板使用DirectQuery SQL数据库作为数据源 而服务器地址和数据库名称被提取到参数中 还有一个参数包含一个ReportId
  • libtool 在 Ubuntu 13.04 上构建 thrift 0.9.1 时出错

    在 Ubuntu 13 04 上构建 thrift 0 9 1 支持 C C java C perl python 时出现此错误 configure 不带任何选项运行 make 不带任何选项运行 Making all in test mak
  • 如何调整 Windows 窗体以适应任何屏幕分辨率?

    我知道这是重复的问题 但我检查了所有其他相关问题 他们的答案没有帮助 结果仍然与屏幕截图 2 中所示相同 我是 C Windows 窗体新手 如截图1所示 我有Form1有一些控件 每组控件都放在一个面板中 我在 PC1 中设计了应用程序
  • C++中的类要具备什么条件才能成为容器?

    我是 C 编程新手 偶然发现了这个术语containers举例如下vector deque map etc 一个企业的最低要求应该是什么class应该满足被称为container in C 我将从 范围 这个概念开始 Range 只有两个方
  • MSMQ接收和删除

    是否有任何选项可以在读取消息后将其从 MSMQ 中删除 比如 接收 删除可以作为原子操作运行吗 听起来您想查看下一条消息 然后在处理完成后接收它 Message message Queue Peek Queue ReceiveById me
  • 将 2 个字节转换为整数

    我收到一个 2 个字节的端口号 最低有效字节在前 我想将其转换为整数 以便我可以使用它 我做了这个 char buf 2 Where the received bytes are char port 2 port 0 buf 1 port
  • 如何在 EF Core 2.1 中定义外键关系

    我的 DAL 使用 EF Core 2 1 这就是我的模型的样子 一名用户只能拥有一种角色 Role entity kind of master public class Role public int RoleId get set pub
  • MSChart 控件中的自定义 X/Y 网格线

    我有一个带有简单 2D 折线图的 C Windows 窗体 我想向其中添加自定义 X 或 Y 轴标记 并绘制自定义网格线 例如 以突出显示的颜色 虚线 我查看了 customLabels 属性 但这似乎覆盖了我仍然想显示的默认网格 这是为了
  • C 与 C++ 中的 JNI 调用不同?

    所以我有以下使用 Java 本机接口的 C 代码 但是我想将其转换为 C 但不知道如何转换 include
  • 选择 asp.net CheckBoxList 中的所有项目

    ASP NET 和 C 我想要一个带有 全选 项目的复选框列表 当这个特定项目是 已选择 所有其他都将被选择 也 当选择被删除时 这个项目 也将来自所有人 其他物品 选中 取消选中 任何其他项目只会有一个 对特定项目的影响 无论选择状态如何
  • 在 MacOS 终端上运行 ffmpeg [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我对 MacOS 相当陌生 我发现使用终端来获取信息并不容易ffmpeg和我在 Window 上一样正常运行 我有 ffmpeg 二进制文件ffmpe
  • 在 Qt 中播放通知(频率 x)声音 - 最简单的方法?

    Qt 5 1 或更高版本 我需要播放频率为 x 的通知声音 n 毫秒 如果我能像这样组合音调那就太好了 1000Hz 持续 2 秒 然后 3000Hz 持续 1 秒 最简单的方法是使用文件 WAV MP3 例如如此处所述 如何用Qt播放声音
  • 不使用放置 new 返回的指针时的 C++ 严格别名

    这可能会导致未定义的行为吗 uint8 t storage 4 We assume storage is properly aligned here int32 t intPtr new void storage int32 t 4 I k
  • 解释这段代码的工作原理;子进程如何返回值以及在哪里返回值?

    我不明白子进程如何返回该值以及返回给谁 输出为 6 7 问题来源 http www cs utexas edu mwalfish classes s11 cs372h hw sol1 html http www cs utexas edu
  • 初始化列表在 VC10 中不起作用

    我在 VC 2010 中编写了这个程序 class class1 public class1 initializer list
  • 运行 xunit 测试时无法将输出打印到控制台窗口

    public class test2InAnotherProject private readonly ITestOutputHelper output public test2InAnotherProject ITestOutputHel

随机推荐

  • JavaWeb阶段综合案例

    文章目录 综合案例 1 功能介绍 2 环境准备 2 1 工程准备 2 2 创建表 3 查询所有功能 3 1 后端实现 3 1 1 dao方法实现 3 1 2 service方法实现 3 1 3 servlet实现 3 1 4 测试后端程序
  • 计算机网络第六章:应用层

    应用层协议的特点 每个应用层协议都是为了解决某一类应用问题 而问题的解决又往往是通过位于不同主机中的多个应用进程之间的通信和协同工作来完成的 应用层的具体内容就是规定应用进程在通信时所遵循的协议 应用层的许多协议都是基于客户服务器方式 客户
  • MFC中添加的ID资源号提示找不到声名问题

    1 查看resource h资源文件 基本上都是因为某些界面上的修改等原因造成了里面部分定义ID号值重复了才报的错 所以要在resource h文件中手动修改成不一样的id值
  • osgEarth的Rex引擎原理分析(一二四)osgEarth着色器文件与场景树节点的对应关系

    目标 一二三 中问题210 场景树 rex terrain ResourceReleaser surface Layer LayerN RenderLeaf RenderLeaf 1 rex RexEngine SDK vert glsl
  • 让Project把周六和周日也计算工期

    GPS平台 网站建设 软件开发 系统运维 找森大网络科技 https cnsendnet taobao com 来自森大科技官方博客 http www cnsendblog com index php p 1046 上之类的教程很少 在摸索
  • 系统架构设计师教程(第2版)

    系统架构设计师教程 第2版 作为全国计算机技术与软件专业技术资格 水平 考试指定用书 系统地介绍了系统架构设计师的基本要求 应具备的基础知识和需要掌握的知识 全书分上 下两篇 共计 20 章 上篇为综合知识 介绍了系统架构设计师应熟练掌握的
  • 前端开发之走进Vue.js

    Vue js作为目前最热门最具前景的前端框架之一 其提供了一种帮助我们快速构建并开发前端项目的新的思维模式 本文旨在帮助大家认识Vue js 了解Vue js的开发流程 并进一步理解如何通过Vue js来构建一个中大型的前端项目 同时做好相
  • 1的1次方+2的2次方+3的3次方+...+n的n次方

    此处n最大取160哦 能力有限大整数的表示还没学会 以后学会了还会继续更的哦 public class Test public static void main String args new Test test1 public void
  • C++学习(四七四)java获取上一级目录

    File externalFile getApplicationContext getExternalFilesDir null storage emulated 0 Android data com example testnativec
  • 使用 Spark MLlib 做 K-means 聚类分析[转]

    原文地址 https www ibm com developerworks cn opensource os cn spark practice4 引言 提起机器学习 Machine Learning 相信很多计算机从业者都会对这个技术方向
  • 竞赛选题 协同过滤电影推荐系统

    文章目录 1 简介 1 设计概要 2 课题背景和目的 3 协同过滤算法原理 3 1 基于用户的协同过滤推荐算法实现原理 3 1 1 步骤1 3 1 2 步骤2 3 1 3 步骤3 3 1 4 步骤4 4 系统实现 4 1 开发环境 4 2
  • Android,我么用原生还是混合?

    本文将从4个角度 讲解分析混合开发 与使用方式 希望给大家更多思路 前言 最近开发几个项目 牵涉到Android的几种开发模式 对于原生态开发 web 应用开发以及混合模式开发 本人认为并不是哪一种就是最好的 哪一种就是最差的 这个完全是根
  • 【ROS】RViz、Gazebo和Navigation的关系

    1 RViz RViz Robot Visualization 机器人可视化 是一个用于可视化机器人系统的开源工具 用于显示和调试机器人的传感器数据 状态信息和运动规划等 它是ROS Robot Operating System 的一部分
  • /c6.e3b.biz/index.php,iptv-m3u-maker/tv.m3u8 at d59f4e688e2b4486d6219f094aac886be53c25d2 · srsman/ip...

    EXTINF 1 group title 其他频道 Oxigeno90 http i50 letio com 9102 aac EXTINF 1 group title 其他频道 ProyectoP http 149 56 23 143 8
  • Linux如何用命令创建文件和文件夹

    linux中如何使用命令创建文件 并执行 1 通过快捷方式 CTRL ALT T键 打开终端命令窗口 我们在终端实现操作 ccoy ccoy PC 2 进入目录之后 转到需要的目录之下 ccoy ccoy PC cd demo ccoy c
  • 价值32k!阿里顶级架构师深度解析SpringBoot进阶原理实战手册

    前言 在当下的互联网应用中 业务体系日益复杂 业务功能也在不断地变化 以典型的电商类应用为例 其背后的业务功能复杂度以及快速迭代要求的开发速度 与5年前的同类业务系统相比 面临着诸多新的挑战 这些挑战中核心的一点就是快速高效地实现系统功能
  • win7访问局域网计算机提示凭据,win7系统访问局域网共享文件时提示输入网络凭据的解决方法?...

    win7系统访问局域网共享文件时提示输入网络凭据的解决方法 最近有用户在将系统升级到win7系统之后 访问局域网共享文件时 系统却弹出输入网络凭据的对话框 这让用户很苦恼 其实这是微软为win7系统添加了新的安全机制导致的 没有密码的访问形
  • 基于STM32的ESP8266天气时钟(1)---------AT指令获取天气数据

    前言 很久以前就想着能够做一个可以显示天气还有时间的小东西 刚好最近有空 研究了一下 发现并没有之前想象的那么难 网上也有很多资料 不过大部分并没有一步一步详细介绍 故把自己的学习过程分享出来 算是自己的输出 也给需要学习的小伙伴提供一下思
  • Vue3的数据监视(Watch)

    引入 vue 的数据监视可以进行数据检测但是要进行数据的引入 import watch from vue 参数配置 一共分为三个参数配置分别为 数据 执行方法 执行条件 watch gt dog age newValue oldValue
  • 问题解决: multiple definition of XXX

    在编译程序的时候 遇到了一个问题 花点时间记录一下 在Qt中创建一个类后 一般是先在 h文件中声明变量与函数 然后在对应的 cpp文件中对各个函数进行定义 这在往常使用中没有任何问题 今天在使用Qt时 在各 cpp源文件编译时出现了许多mu