2

我正在尝试从另一个文件中的类声明一个对象。我已将其添加#include "transfer.h"到我的metadata.cpp文件中,但出现以下错误:

 metadata.o: In function `importMetadata':
 metadata.cpp:(.text+0x81): undefined reference to A::B::C::Transfer::Transfer()'
metadata.cpp:(.text+0x81): undefined reference to A::B::C::Transfer::~Transfer()'

转移定义为transfer.h

namespace A{
  namespace B{
    namespace C{
       class Transfer {
            public:
               Transfer();
               ~Transfer();
               int copydata();
            ... more code goes here.
        };
    }
   }
}

该文件transfer.cpp如下所示:

Transfer::Transfer(){
}
Transfer::~Transfer(){
}

我还在using namespace A::B::C;metadata.cpp 文件的标题上做一个。有人可以帮我吗?在我声明的函数int importMetadata()中,我正在执行“transfer.copydata();”metadata.cppTransfer transfer;metadata.cpp

4

2 回答 2

2

由于您有链接器错误而不是编译器错误,这会告诉您 #include 语句正在执行您想要的操作,并且编译器可以识别 Transfer 类及其构造函数。当链接器试图在它被告知链接但找不到它的 .o 或 .lib 文件之一中查找对 Transfer::Transfer() 函数实现的引用时,就会发生错误。

您可能有一个 transfer.cpp 与 transfer.h 一起使用,并且此文件缺少 Transfer 构造函数和析构函数的实现。这可能是因为这些函数完全丢失或被意外定义为不同的签名。

所以 transfer.cpp 应该看起来像:

A::B::C::Transfer::Transfer()
{
}

A::B::C::Transfer::~Transfer() 
{
}

另一种可能性是您正在尝试链接从库传输的实现。在这种情况下,您需要告诉链接器使用 .lib 文件作为输入。其语法取决于您使用的编译器。

于 2012-06-16T01:24:14.147 回答
1

希望您遗漏了部分 transfer.cpp 文件,但如果您不这样做,它应该定义命名空间以匹配您的头文件,如下所示:

namespace A{
  namespace B{
    namespace C{
        Transfer::Transfer(){
        }
        Transfer::~Transfer(){
        }
    }
  }
}

如果您已经完全定义了命名空间,无论是内联的还是上面的,您都需要确保您的项目中包含了 transfer.cpp 文件。似乎链接器无法找到您的源文件。

于 2012-06-16T02:44:19.080 回答