获得多个定义错误

时间:2009-11-26 02:30:19

标签: c++ g++ linker compiler-errors

我正在尝试编译一些c ++文件。我在链接阶段得到以下类型的错误(编译工作正常) -

<小时/> Main.o: In function operator<<(std::basic_ostream<char, std::char_traits<char> >&, Set const&)':
/usr/include/c++/4.3/new:105: multiple definition of
operator<<(std::basic_ostream< char, std::char_traits >&, Set const&)' bundleXX.o:/xxx/DATASTRUCTURES/SET/set.h:162: first defined h ere

operator<<(std::basic_ostream<char, std::char_traits<char> >&, Set const&)':
/usr/include/c++/4.3/new:105: multiple definition of


此代码之前正确链接。只有在我尝试将这些代码与其他代码相关联时,才会爆炸。

我的makefile是这样的: - 生成文件

<小时/> Main.o: In function print(std::basic_string<char, std::char_traits<char>, std::allo cator<char> >, int)':
/xxx/misc.h:28: multiple definition of
print(std::basic_string, std::allocator >, int)' bundleXX.o:/xxx/misc.h:28: first defined here

print(std::basic_string<char, std::char_traits<char>, std::allo cator<char> >, int)':
/xxx/misc.h:28: multiple definition of


我非常感谢一些帮助。

由于

编辑:我尝试了内联,但它没有用。我最终最小化了我在新代码中包含代码的次数,并最终正确链接。我认为可能是递归包含的情况。谢谢你的帮助。

3 个答案:

答案 0 :(得分:3)

是print(std :: string,int)和operator&lt;&lt;的定义吗?在多个C文件中包含的头文件中定义的函数。

尝试在这些函数之前添加内联,或者定义要链接的C文件中的函数。

修改 你的编辑提到你正在做“递归”包括: 你的包含文件周围有#ifdef守卫吗? 这将阻止同一翻译单元多次包含相同的标题。

#ifndef __MY_FILENAME_H_
#define __MY_FILENAME_H_
// your header details
#endif // End of the file...

定义可以是任何东西,只要它对头文件是唯一的。只需遵循某种标准即可。

答案 1 :(得分:1)

链接阶段的多个定义几乎始终是由于头文件中包含代码而引起的,但我不确定是这种情况。

请查看xxx/DATASTRUCTURES/SET/set.h的第162行和xxx/misc.h的第28行(在此处发布,在上下文中有几行代表上下文,以获得进一步帮助)。

根据您收到的消息,这似乎是冲突的地方。很可能你正在接口的新东西与你当前的东西共享一个类型名称。

答案 2 :(得分:0)

misc.hset.h中你实际定义了链接器错误中提到的函数,还是只是将它们声明为存根?

如果您实际定义它们(即,如果您实际实现了函数体),那么在链接器阶段您可能会遇到多个定义问题。您可以在单独的.cpp文件中定义它们,也可以使用inline关键字声明它们。如果它们的功能非常短,后一种选择会更好。