解决GNU中的链接器错误以进行重新声明

时间:2012-11-30 05:54:27

标签: c++ linux gnu

我有以下实现:

A的标题:

class A
{
public:
foo();
};

A有自己的.cpp文件,其中包含foo()

的实现

// B的标题

#include "A.h"
class B
{
public foo();
};

注意:B没有自己的标题

现在在C.cpp类中,我想重用A的头和B.o的实现。所以在C.​​cpp我做:

//C.cpp
#include "A.h"
....
B b;
b.foo();
..

当我编译上面的内容时,我必然会得到函数foo()的重新声明错误。我想知道是否有任何方法可以告诉GNU编译器采用B.o并省略A.o ...或者告诉编译器考虑make文件中包含实现的第一个对象而忽略其余的对象?

我正在使用GNU v2.16

1 个答案:

答案 0 :(得分:2)

您的问题与A的重新声明有关,因为在C.cpp它会看到A一个到A.h和另一个到B.h的2个声明,所以只是防守A.h在一个标题后卫中,以避免多次包含它,通常你应该始终保护你的标题:

#ifndef HEADER_A_h_INCLUDED
#define HEADER_A_h_INCLUDED
class A {...};
#endif

现在,如果你不止一次包括A.h,那么这名后卫将把第二名包括为无效!