我正在尝试编译一些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
我非常感谢一些帮助。
由于
编辑:我尝试了内联,但它没有用。我最终最小化了我在新代码中包含代码的次数,并最终正确链接。我认为可能是递归包含的情况。谢谢你的帮助。
答案 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.h
和set.h
中你实际定义了链接器错误中提到的函数,还是只是将它们声明为存根?
如果您实际定义它们(即,如果您实际实现了函数体),那么在链接器阶段您可能会遇到多个定义问题。您可以在单独的.cpp
文件中定义它们,也可以使用inline
关键字声明它们。如果它们的功能非常短,后一种选择会更好。