问题标签 [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 投票
9 回答
38664 浏览

c++ - 由于在多个 cpps 中包含相同的标头而导致重复的多个定义错误

因此,无论我做什么,我似乎都无法避免 Dev C++ 出现大量多重定义错误,因为我在同一个项目的多个源代码文件中包含了相同的头文件。我强烈希望避免将所有源代码转储到一个文件中,并且只包含一次标题,因为这会使我的文件非常长且难以管理。

本质上,这就是正在发生的事情:

示例 Cpp 文件(它们几乎都像这样):

请记住,我有大约 5 个包含这个头文件的 cpp 文件,每个文件都处理头文件中的不同类型的结构。在这个例子中,只有一个结构包含几个成员,而实际头文件中有大约 4-6 个不同的结构和更多的成员。我包含的所有文件都遵循与您在此示例中看到的相同的公式。

现在我明白标头保护只会阻止每个单独的 cpp 文件多次包含头文件。似乎正在发生的事情是,当编译器在每个 cpp 的开头读取包含时,它会重新定义头文件,这导致它吐出以下行和行:

我会为项目中几乎每个包含标头的 cpp 文件看到一组这样的文件。我已经尝试将结构和结构变量的定义移动到 cpp 文件中,但是其他 cpp 文件看不到它们或无法使用它们,这非常重要,因为我需要项目中的所有文件才能工作使用这些结构。

但是关于这个问题的最令人困惑的部分需要更多解释:

我在这个项目中设置这些多个文件的方式与我正在使用的书相同,John S. Harbour 的 All In One Game Programming。当我为书中的示例项目创建文件时,我遇到了完全相同的问题,这些文件要求同一项目中的多个 cpp 包含一个标头。

我可以逐字逐句地从书中输入它们,而且我的意思是逐字逐句......
我会得到项目中每个 cpp 的一系列 MD 错误。

如果我从本书附带的 CD 中加载示例项目,它会毫无问题地编译和运行,尽管文件本身以及项目选项在所有外观上都与我创建的相同。

如果我创建了自己的项目文件,并简单地从 CD 中添加示例项目的源文件和头文件,这也将编译和运行,尽管我发现它们和我的没有区别。

因此,我尝试制作自己的项目文件,然后创建空白的源文件和头文件并将它们添加到其中,然后通过从 CD 上它们要对应的文件中复制和粘贴它们的内容来填充它们(相同那些已经工作的)。果然,我会得到同样的东西……一行又一行的 MD 错误消息。

我完全感到困惑。我已经多次重复所有这些方法,并且确定我没有输入错误或错误复制代码。预制文件本身似乎有些东西。一些配置设置或其他我完全丢失的东西......这将导致它们正确编译,而我自己制作的文件不会。

0 投票
8 回答
180993 浏览

c - 如何防止C中的多个定义?

我是 C 新手,我只是想用 Code::Blocks 编写一个控制台应用程序。这是(简化的)代码:main.c:

测试.c:

当我尝试构建这个程序时,它给出了以下错误:

我不可能多次定义测试(尽管我不知道下划线来自哪里),而且定义似乎不太可能以某种方式被包含两次。这就是所有的代码。

我已经排除了这个错误是由于与其他函数或文件被称为 test 或 test.c 的一些命名冲突。请注意,多个定义和第一个定义位于同一文件的同一行。

有谁知道是什么原因造成的,我能做些什么?谢谢!

0 投票
2 回答
72 浏览

visual-c++ - VC++中的链接错误LNK2005

我有一个我想实现按钮类的程序。我在 button.h 中声明了所有变量并在 button.cpp 中定义了所有方法,我在 WINMAIN 中调用这些函数,出现以下错误。

keylogger.obj : 错误 LNK2005: "struct HBITMAP__ * hOldBmp" (?hOldBmp@@3PAUHBITMAP__@@A) 已经在 Button.obj 中定义

该错误是针对多个定义 hOldBmp 但它仅在 button.h 中定义

0 投票
4 回答
2837 浏览

c++ - 向量多重定义链接错误

矢量仅包含在一个源文件中。头文件中唯一包含的 stl 是字符串。但是我无法摆脱多个定义错误(下面的示例)。有任何想法吗?

./plugin_dfb.o:mipsel-linux-uclibc/include/c++/4.2.0/bits/stl_bvector.h:182: `std::operator-(std::_Bit_iterator_base const&, std::_Bit_iterator_base const&) 的多重定义' ./painter.o:mipsel-linux-uclibc/include/c++/4.2.0/bits/stl_bvector.h:182: 首先在这里定义

0 投票
3 回答
3543 浏览

c++ - 链接时大量 std:: 函数的多重定义

我正在尝试将一些外部代码集成到我的应用程序中。我的代码是纯 C,但新代码是 C++,所以我只是将我的 C 文件重命名为 .cc 并用 g++ 编译了整个东西。

它编译得很好,但我得到了一堆链接错误:

我正在使用 Cmake 来构建这个东西,但没有什么复杂的。我不知道为什么会出现所有这些错误,因为我的代码只是一堆方法(我不使用 std 包中的任何东西)而且我尝试集成的代码并不复杂。

请注意,警告来自链接我自己的代码,而不是(还)来自新的 C++ 代码。

有人吗?

编辑:在挖掘了我尝试集成的外部代码后,我发现了一些包括:

此外,iostream 也包含在其他标头中,并且所有标头都包含保护。

更新:我设法清理了一些外部代码并删除了不必要的依赖项。我仍然有一些链接器错误,但要少得多:

代码包括cmathand cstdlib,并使用默认命名空间引用 abs 和其他函数。这可能是问题吗?

0 投票
2 回答
221 浏览

c++ - 如何更改指针访问运算符的含义

这可能是一个非常明显的问题,如果是,请原谅我。

我的项目中有以下代码片段,

问题
我可以更改 的含义ptr[index]吗?因为我需要返回ptr[a[index]]where a 是用于子索引的数组的值。我不想修改现有的源代码。需要添加任何可以改变行为的新功能。

由于在我的代码中访问索引运算符的地方太多(准确地说是 536 个),并且索引下标运算符内部有复杂的公式,所以我不倾向于在很多地方更改代码。


PS:
1.我尝试了运算符重载并得出结论,这是不可能的。
2. p[i] 也将转换为 *(p+i)。我无法重新定义基本运算符“+”。

所以只想再次确认我的理解以及是否有任何可能的捷径可以实现。
否则我需要通过更改每一行代码的皇家方法来修复它:)。

0 投票
3 回答
1300 浏览

c++ - C++ 多定义错误

从 sth 对这个问题的回答开始:

我想知道如果将以下代码放入由不同 .cc 文件多次包含并链接在一起的头文件中,如何解决多个定义错误:

0 投票
4 回答
195 浏览

c++ - 如何从也具有“main”的 .cpp 源文件中链接函数?

我想使用 .cpp 源文件中的一些函数,这些函数在我的 .cpp 源文件中有一个 main 函数。(我正在使用 make 和 gcc 构建。)

这是我的 Makefile 中的规则:

这是输出(更改了一些名称以防止分心):

如何向 gcc 表明我想使用 foo.cpp 中的 main?

更新:我应该补充说“bar.cpp”是“别人的”代码,并且有它自己的主要理由。(听起来我应该与其他人合作,让他将共享函数拆分为单独的文件。)

0 投票
1 回答
12611 浏览

c++ - 将函数添加到以前的链接文件后出现多定义链接器错误

所以我的程序运行良好。编译,链接,运行,作品。然后,我决定在我的一个文件中添加一个简单的函数,如下所示:

该函数定义是我对代码所做的唯一更改。其他一切都和原来一样。还没有什么叫它。我编译,但它无法链接,g++ 为每个 #includes 这个文件提供这些错误之一:

如果我注释掉isVowel,它会再次起作用。我试过改名,还是不行。我试过用 just 替换它void randomFunctionName() {},仍然不起作用。我尝试将其设为非内联并将函数体放入 Utility.cpp,但仍然无法正常工作。我非常困惑。为什么添加一个简单的函数会搞砸链接器?

0 投票
5 回答
3213 浏览

c - 使用内联函数乘以定义的链接器错误

链接器报告内联函数的多重定义错误。

我在头文件中有以下代码:

我将头文件包含在多个源 (.c) 文件中。

我希望将上述函数粘贴在任何调用它的地方。
是否有一种技术可以在包含的每个源文件中没有函数的多个定义? 如果是,请举例说明。

我需要嵌入式平台的性能优化。
当在其他翻译单元中定义函数时,编译器或链接器是否足够智能以内联函数?

我在嵌入式 ARM9 平台上使用 Green Hills 编译器 4.2.4。假设 2000 年之前的 C 语言标准。这是 C 代码而不是 C++。