问题标签 [multiple-definition-error]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
7323 浏览

c++ - 外部变量导致多重定义错误

我一直在尝试使用 extern 来使用先前定义的变量。

我以前没有使用过 extern,现在我需要使用它来定义变量一次并在多个文件中使用它们

我已经为这个问题编写了最小化版本的代码。我有四个文件

库文件

车辆.h

以下是名为 vehicle.cpp 的 vehicle.h 文件的实现

主文件

我正在使用 g++

我收到以下错误:

我检查了以下输出:

每次包含 lib.h 时都会出现多个定义。

我的问题是:

  • 当定义保护存在时,为什么会多次包含 lib.h
  • 我将如何定义'extern'变量并在同一个文件中初始化它(因为它稍后在同一个文件中使用)
0 投票
1 回答
3604 浏览

c++ - C++中相同符号的多个定义(Visual Studio)

我有一个非常简单的代码问题我正在关注 chrono::engine http://www.chronoengine.info/mediawiki/index.php/Demo_fourbar的教程 我在 C++ 编程方面没有太多经验(我有一些 Java 经验),因此我尝试在不同的文件(MyEventReceiver.h 和 MyEventReceiver.cpp)中定义 MyEventReceiver(教程中的一个类),以了解 C++ 代码的经典结构

这是代码的版本

MyEventReceiver.h

在 MyEventReceiver.cpp 中实现如下

和 Main_2.cpp 中的主文件(我清空了它,无论有没有代码,它都会给我同样的错误 - 这基本上只是设置 3D 引擎 Irrlicht 和 chrono::engine 的碰撞模型中的一些力学特性)

基本上,代码定义了一个事件接收器,以便用户在运行程序后可以通过 GUI 操作与由 chrono::engine 和 Irrlicht 引擎构建的 3D 环境交互我在 MyEventReceiver.h 文件中定义了所有必需的库和所需的库命名空间

问题是它无法编译(请注意,我已经测试了引擎 - 使用相同的#include 并在一个文件中使用命名空间并且它在不同的项目中工作 - ),我认为问题来自结构的头文件

我得到了那些错误行

等等......(它继续这样)和最后的错误

我正在使用 Visual Studio 2010 C++。我定义了一个全局解决方案,并在这个解决方案中定义了几个项目(我上面编写的程序是其中一个项目)我确信它一定很容易解决,但无法真正找到解决方案。如果您需要更多详细信息,请告诉我

非常感谢最好的问候文森特

编辑:如果我将所有代码放在一个文件中,如下所示

这样,我避免了从 Irrlicht 3D 引擎定义多次未定义为内联的函数。不幸的是,如果项目变得很大(必须在一个唯一的 .cpp 文件中定义所有依赖于 3D 引擎的类),这种编码方式会变得非常麻烦,是否有一种设计模式可以遵循,以便可以避免多个定义的对象,每个类都定义在一个单独的文件中?

非常感谢

最好的

文森特

0 投票
3 回答
177 浏览

c++ - 在同一个exe但不同的目标文件的多个函数中使用共享库的静态变量

(我已经编辑了我原来的问题,使其更容易理解)

这是问题的原型....

//Txn.h --- 这有一个静态变量,可由包含它的 pgms 使用。

//TXN.cpp

-> 产生 LibTxn.so
//class1.cpp -> 使用来自 Txn.h 的静态变量的 pgm 之一

-> 使用 LibTxn.so 生成 class1.o。
// class2.cpp -> 另一个使用来自 Txn.h 的静态变量的 pgm

-> 通过包含 LibTxn.so 生成 class2.o
-> 使用 class1.o、class2.o 生成 class3(一个 exe)。由于 class1 和 2 都有来自“Txn.h”的语句“Txn::i=0”,因此会发生多个声明问题。
-> 。如果我从 Txn.h 中删除语句“Txn::i=0”,则会出现“未定义引用”错误。
-> .在高等级,这个问题是一种具有会话变量的问题,应该可以从 exe 中的任何 func 进行评估。这些 func 可以在用于形成 exe 的任何 obj 文件中。我适合任何溶胶,即使没有静电。但我无法更改不同 .o 文件(正在使用此会话 var)的创建并结合 .o 来生成 exe。

0 投票
1 回答
6317 浏览

c++ - 每个构造函数、方法和运算符重载的 c++ 多重定义错误

我意识到这里已经有很多“多重定义”问题,但我在过去的 2 个小时里一直在寻找解释,但没有找到。很抱歉,如果这是重复的。

现在我有 2 个类:Array.h 和 Vector.h。两者都没有任何全局变量,也不依赖于另一个(即 Array 不使用 Vector,Vector 不使用 Array)。实现在 .h 文件中。

这是我的 Main.cpp:

...一切运行良好。但是,当我创建另一个仅包含 #include 语句的 .cpp 文件时...

数据读取器.cpp

...然后一切都崩溃了,我得到了 Vector 中每个方法、构造函数和运算符重载的一大堆错误:

但如果我只有#include "Array.h"在 DataReader.cpp 中,那么一切运行正常!

#include "Vector.h"不适用的可能有什么问题#include "Array.h"

编辑:将实现分离成 .cpp 文件修复了错误,但这并不能解释为什么我必须为 Vector 而不是 Array 这样做。

0 投票
1 回答
1833 浏览

c - 使用 Makefile 重新定义问题

主.c:

支持.c:

原型.h:

生成文件:

每当我使用上面定义的文件运行 makefile 时,我总是会遇到多重定义错误,尽管有条件编译。

我不确定这里发生了什么以及如何解决这个问题。

错误信息是:

0 投票
0 回答
620 浏览

c++ - 包含 .h 的 c 文件会导致奇怪的“多重定义”错误吗?

我从事一个包含c源文件和源文件c++的项目。
我使用如下代码:

包括 c 文件。

但是我得到了一个.h没有文件的 c.c文件。它会导致(我认为)许多错误:

其中PeriodicFaultReport, FaultActiveEventReport, FaultInactiveEventReport,FaultLatchEventReport都在其中声明,"DataStruct.h"并且该文件没有.c文件。

此外,我注意到PeriodicFaultReport, FaultActiveEventReport, FaultInactiveEventReport,FaultLatchEventReport都是global variables.
[重要的]

内容相"DataStruct.h"对于c

我知道可能有一个像这里
这样的答案 但这是不对的:我从一个项目中
获取所有文件,并且在那里多次包含在其他 .h 文件中,它没有问题。 (项目在,这可能是没有问题的原因) 但是这是真的吗,有助于这一点并打破标准?c"DataStruct.h"
cVS2008
VSc

0 投票
2 回答
4499 浏览

c - 我们可以声明、定义和赋值给一个变量并在另一个文件中使用这些变量吗?

我是 C 编程的初学者,我正在尝试不同的方法并尝试使用小程序。

我有四个文件。两个头文件和两个源文件。我想要:

  1. 在一个头文件中声明一个变量(实际上是两个变量和一个字符)和一个函数(来自第二个源文件)。
  2. 定义这些变量并在第二个头文件中为它们分配值(从第 1 点开始的变量)。
  3. 编写一个包含这两个头文件的函数,并在一个源文件中使用这些文件(第 2 点)中的值(没有 main- 仅使用变量的函数定义)。
  4. 有一个从第二个源文件调用函数的主源文件(从第 3 点开始。)

我怎么会这样?我在两个 .c 文件中都包含了两个头文件。但是当我尝试编译和链接它(在 Linux 中使用 GCC)时,我得到 multiple definition ... first defined here所有变量的错误。

我看过这些答案FirstSecond 我不太理解Second中的答案,因为我无法弄清楚如何使用 header 防护。我无法弄清楚如何检查所有框(第 1 点到第 4 点)。

header1.h

header2.h

fn文件.c

文件main.c

0 投票
1 回答
1792 浏览

c++ - C++11类函数的多重定义

已解决:我完全是个傻瓜。在仔细检查所有文件并通过我们专有的依赖文件生成器进行追溯之后,事实证明确实存在最近添加到文件系统中的恶意 .cpp 包含,这导致了问题。对不起,谢谢大家的帮助!XD

我遇到了一个令人沮丧的问题,我希望有人能帮忙解决一个晦涩难懂的错误。基本上,我在头文件中声明一个通用类,如下所示:

请注意,我已经声明了一次 pragma 以防止多个定义,并且所有函数原型都放在类定义中。对应的类定义如下:

这个类在很多其他文件中使用。例如:

但是当我编译时,类定义的每个函数成员都会出现以下错误:

请注意它似乎连续两次重复相同的 3 行错误。对于每个构造函数/析构函数/函数声明,都会重复相同的错误模式。还要注意它似乎是在说 foo.cpp 中的函数 foo() 是首先在 foo.cpp 中定义的,这似乎没有多大意义。但我刚刚注意到,它以 bar.o 开头,然后是 blah.o ...?

真的在这个问题上摸不着头脑,似乎无法破译问题出在哪里或我应该看哪里。任何帮助将不胜感激!:D

附录:

  • 我不能发布原始代码,因为它来自我的工作。我希望这个示例片段足以至少给出一些关于我应该从哪里开始寻找的方向,除非当前设置的代码有任何问题。
  • 我没有在代码的其他地方包含任何 .cpp 文件。我只包括.h。
  • 原始代码在头文件类声明的末尾有分号,只是忘记包含在此处发布的示例中。更新以反映这一点。
  • foo.h 的包含在所有文件中都是一致的(没有意外混合大小写)。
  • 其他类似定义的类使用这种完全相同的模式,但奇怪的是没有产生相同的错误。:?
  • 重申一下,我确定我不会在我的程序中的任何位置#include 任何 .cpp 文件,只有头文件会包含在程序的其他位置。
  • 我也确信构造函数在头文件中声明为 foo(); 就像上面的代码示例一样,而不是 foo(){}。
  • 编译器支持编译指示一次(使用 g++)。
  • 修复了原始代码中未找到的上述示例中的另一个错字(头文件名周围的引号)
  • 我正在开发的系统实际上非常大。整个代码中有许多包含和依赖项(甚至是一些循环依赖项),并且使用了一些在整个系统中传递的单例。上面的例子是我在最基本层面上看到的问题的简化表示,我看到的上述错误实际上是为我已经合并到系统中的许多新文件(不仅仅是一个)生成的. 奇怪的是,我以类似方式定义的其他文件没有也没有产生这个问题,这就是为什么我很困惑它现在似乎正在引起问题。
0 投票
3 回答
134 浏览

c++ - 为什么在多重定义的情况下 char* 和 char[] 有区别?

  • 在 interface.h 中定义 strInterface

    /li>
  • 在 OneUsing 类中,调用 strInterface 字符串

    /li>
  • 在 main.cpp 中,包含 interface.h,因为 strInterface 被直接调用;它还包括 oneUsingInterface.h,因为将创建 OneUsing 实例。

    /li>
  • 现在,出现的问题:

    /li>
  • 但是,如果 strInterface 是这样定义的,那么就没有问题了:

    /li>

有些人可以告诉我更多关于这种情况下char*和之间区别的细节吗?char[]

PS:我们经常在头文件中用关键字声明全局变量,extern在别人的实现文件中定义。

0 投票
1 回答
514 浏览

c++ - 奇怪的多重定义错误

我收到了上面的错误消息。但是我找不到它被多重定义的代码,所以我在'account.h'和'AccountHandler.cpp'中将所有account_number更改为number_of_account,并且

它编译得很好。

之后,我稍微改变了 main.cpp

并再次出现错误消息。

我在所有头文件中使用了#ifndef #define #define,当我更改AccountHandler.cpp和accounthandler.h中的变量时,它再次编译得很好,所以我想知道为什么会这样

这是代码: