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

c++ - 多个来源中的模板实现

我使用以下模式将模板声明和实现分开:


decl.h(声明)


impl.cpp(实现)


现在我想给 Foo 添加一个新方法,但是 impl.cpp 文件已经很大了,所以我想把它移到一个单独的文件 impl2.cpp 中;


decl.h(声明)


impl.cpp(实现)


impl2.cpp(实现)


这里主要关注的是重复的实例化,我该如何避免这些?

0 投票
2 回答
1496 浏览

c++ - 首先在 g++ 中从类到命名空间定义

我已经阅读了很多这样的问题,但我不能 100% 确定我的问题是否有所不同。我已经搜索了很多正确的答案,但大多数答案都围绕着宏守卫。我有一个从中派生的自定义字符串类,std::string后来因为我在现实世界中使用该项目,所以我不想仅仅为了扩展功能而派生 std::string。所以我将函数从 customString.h 移到了 utils_string.h 中。这是定义:

我得到了抱怨...first defined here,这是编译器的确切输出。注意:这里没有课

/tmp/ccCFVTXP.o: 在函数utils::string::tolower(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)': listings.cpp:(.text+0x0): multiple definition ofutils::string::tolower(std::basic_string, std::allocator >&)' /tmp/cczDtRdT.o:listing.cpp:(.text+0x0): 首先定义这里 /tmp/ccCFVTXP.o: 在函数utils::string::iequals(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)': listings.cpp:(.text+0x55): multiple definition ofutils::string::iequals(std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&)' /tmp/cczDtRdT.o: Listing.cpp:(.text+0x55): 首先定义在这里 /tmp/ccCFVTXP.o: 在函数utils::string::ilike(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)': listings.cpp:(.text+0x118): multiple definition ofutils::string::ilike(std::basic_string, std::allocator > const&, std::basic_string, std: :allocator > const&)' /tmp/cczDtRdT.o:listing.cpp:(.text+0x118): 首先定义在这里 /tmp/ccCFVTXP.o: 在函数utils::string::prependAndAppendILikeDelimiter(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)': listings.cpp:(.text+0x484): multiple definition ofutils::string::prependAndAppendILikeDelimiter(std::basic_string, std ::allocator > const&)' /tmp/cczDtRdT.o:listing.cpp:(.text+0x484):首先在这里定义/tmp/ccifZISK.o:在函数中utils::string::tolower(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)': match_count.cpp:(.text+0x0): multiple definition ofutils::string::tolower(std::basic_string, std::allocator >&)' /tmp/cczDtRdT.o:listing.cpp:(.text+0x0): 首先在这里定义 /tmp/ccifZISK.o: 在函数utils::string::iequals(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)': match_count.cpp:(.text+0x55): multiple definition ofutils::string::iequals(std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&)' /tmp/cczDtRdT.o:listing.cpp:(.text+0x55 ): 首先在这里定义 /tmp/ccifZISK.o: 在函数utils::string::ilike(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)': match_count.cpp:(.text+0x118): multiple definition ofutils::string::ilike(std::basic_string, std::allocator > const&, std::basic_string, std::allocator > const&)' /tmp/ cczDtRdT.o:listing.cpp:(.text+0x118): 首先定义在这里 /tmp/ccifZISK.o: 在函数utils::string::prependAndAppendILikeDelimiter(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)': match_count.cpp:(.text+0x484): multiple definition ofutils::string::prependAndAppendILikeDelimiter(std::basic_string, std::allocator > const&)' /tmp /cczDtRdT.o:listing.cpp:(.text+0x484): 首先在这里定义 collect2: ld 返回 1 退出状态

我为整个混乱感到抱歉,但我不想错过任何遇到类似问题的人。

还有一件事; 它说match_count.cpp * Listing.cpp * 和Listings.cpp它只是使用 ::utils::string::function() 中定义的函数

0 投票
2 回答
1496 浏览

c++ - 在 winform vc++ 应用程序中发现一个或多个多重定义符号错误

我正在使用 VC++ 中的表单应用程序。我有主窗体,即 Form1.h,还有名为 child.h 的子窗体。我在 form1.h 的按钮单击上调用 child.h 表单。为了调用 child.h,我必须在 Form1.h 中包含 Child.h。

我在 Form1.h 中使用了以下代码

在 Child.h 中,我正在做一些处理。为此,我制作了一个名为param.h的头文件,其中包含一些函数名称和全局变量名称。我在 Child.h 文件中包含了 param.h。

param.h 是

包含 child.h 后显示错误

我不知道为什么会出现这些错误。任何人都可以告诉我解决这些错误的解决方案吗

提前致谢

0 投票
3 回答
1546 浏览

c++ - 在全局范围内声明命名空间错误

我有 3 个文件 Test.h , Test.cpp 和 main.cpp

测试.h

测试.cpp

主文件

在构建过程中,它给出了以下错误..

请尽快帮助..

0 投票
1 回答
3598 浏览

c++ - 头文件包含循环和多重定义

我有一个util.h包含一个函数,它将用于a.h和'bh',以及更多,a.h并将b.h相互包含以访问彼此定义的一些类。

我的问题是,我得到multiple definitionfoo. 如何?

我认为问题可能是,a.h包括util.hb.h,并再次b.h包括,所以我得到了多个 def 错误。util.h但这似乎没有意义,因为util.h我写了#ifndef/#define守卫。

任何人都可以给我帮助,谢谢。

0 投票
4 回答
5109 浏览

c++ - QtCreator 多定义构建错误

这是我的 .pro 文件:

出于某种原因,QtCreator 在从 .cpp 文件构建 .o 文件时不尊重源文件夹结构。这两个文件都将编译为“shadow_build_directory/file.o”。我希望构建过程在影子构建目录中创建 path1 和 path2 目录并将“path1/file.cpp”编译为“shadow_build_directory/path1/file.o”和“path2/file.cpp”编译为“shadow_build_directory/path2/文件.o”。

由于来自两个来源的编译符号在 file.o 中加起来,这还不是什么大问题。当 QtCreator 尝试链接时,它成为一个大问题:

QtCreator 链接 file.o 两次,这使链接器失败并出现多个定义错误。

如何确保 QtCreator 编译为反映源目录结构的目标文件?

谢谢

编辑:

路径 1/文件.cpp

路径2/文件.cpp

QtCreator的构建过程:

0 投票
2 回答
685 浏览

c - 无法重新定义枚举类型 def

我有 bool typedef 的代码

在两个头文件中,如果最终父头文件中不包含它,则子 C 文件当然不能使用 bool 类型,尽管也定义了它的较小头文件的子文件可以。

但是,如果我在最终的父头文件中定义它,那么较小的头文件定义错误“布尔已在当前范围内声明”

我需要一个较小标题的解决方案,它可能包含在可能已经或可能尚未定义 bool 的项目中......最好的方法是什么?

0 投票
1 回答
1931 浏览

c++ - 函数错误/头文件/内联的多重定义

抱歉,如果这是重复的,但是我发现的那些...好吧,我以为我尝试了相同的解决方案,但无济于事。无论如何,我最近尝试将我常用的随机函数的实现移动到一个头文件中:我知道这些函数是如何工作的,我怀疑我会很快改变它们,所以我想,文件越少越好(以及功能很短)。

所以,我试了一下。将 .cpp 文件的内容粘贴到一个新文件中,并添加保护。然后只需包含它,瞧,它就可以了。不幸的是,我将它包含了两次,然后发现,我将相同函数的副本分发到每个文件,因此出现了错误。(仍然会有点困惑,为什么这是标题保护,因为无论如何你最终都会得到一份副本,但我想确实如此)。无论如何,我用谷歌搜索(和 SO'ed),并发现如果你将它们声明为内联 - 这在这种情况下是有意义的 - 那么预处理器(或者这也是链接器?)会做对。现在我想到了......作为一个小问题,DEFINES 是文件本地的,还是全局范围的?(即,如果我在两个文件中包含一个标题,并且标题保护定义......两个文件都包含它,因为定义发生在不同的文件中,还是只有一次?如果它确实被包含两次,您将获得(但未定义)相同函数/类/结构的多个声明,我认为这会引发错误,但我猜它不会在不同的文件中?但是,否则,它可能不会被包括在内,并且它不知道它是什么。那么,重新问一下,DEFINES 是文件本地的吗?)

这是我在文件中的功能被重复的内容(认为只包含一个功能)

然后我在这个文件(即“random.h”)上的两个文件中有#includes

我错过了什么?

编辑:错误消息是:

`randomRange(int const&, int const&)'的多重定义|

在稍作休息的同时,我关闭了 IDE。重新打开后,一切都已修复。显然,添加内联 DID 可以修复它,但是,与运行时的 cpp 文件不同,头文件(如果未添加到项目中)不会更新,除非您手动保存它们。保存后,成功了。对不起,大家。

每日一课:修复此类错误时,请确保您的文件已更新...

0 投票
1 回答
3701 浏览

c - 构建错误:多重定义

我有一个头文件,其中包含一个实际上是 ttf 字体文件的无符号字符数组。在 .c 文件中,我可以加载字体并使用它(我在 .c 文件中包含 ttf 头文件),但问题是当我尝试在另一个 c 文件中使用它时,我得到了这两个错误之一;

我可以得到的第一个错误是我的数组未声明。

所以我包含了包含我的数组的头文件,我得到了第二个错误;多重定义...

有人可以帮忙吗?我不明白。我希望我的解释很清楚,并对我的近似英语感到抱歉:)

0 投票
0 回答
301 浏览

c - Mingw64 多重定义

我正在尝试使用代码块 ide 在 Windows 7 x64 机器上使用 mingw64 编译一个退出的大型 c 项目。我根据本教程为编译器进行了设置:http: //blog.marc-o.org/2010/mingw64-unter-windows-mit-codeblocks

现在我得到了各种标准函数的多个定义错误。看这里:

等等。有谁知道我错过了什么?

PS:mingw32版本编译就好了。