ld:找不到符号

时间:2012-03-10 16:38:17

标签: c++

我正在研究 Ellis Horowitz 编写的 C ++数据结构基础,尝试在第77页上实现该示例。但是,在我构建项目之后,Eclipse Console出现了一些警告。

这是我的头文件:

#ifndef RECTANGLE_H_
#define RECTANGLE_H_

class Rectangle{
public:
Rectangle();
~Rectangle();
int GetHeight();
int GetWidth();
private:
int xLow, yLow, height, width;
} ;

#endif

这是我的源文件:

#include <iostream>
#include "Rectangle.h"
using namespace std;

int main(){
    Rectangle r, s;
    Rectangle *t = &s;

    if(r.GetHeight()*r.GetWidth() > t->GetHeight()*t->GetWidth())
        cout << "r";
    else
        cout << "s";
    cout << "has the greater area" << endl;

    return 0;
}

CDT Build Console显示:

Building target: rectangle
Invoking: MacOS X C++ Linker
g++  -o "rectangle"  ./main.o   
Undefined symbols:
  "Rectangle::Rectangle()", referenced from:
      _main in main.o
      _main in main.o
  "Rectangle::GetWidth()", referenced from:
      _main in main.o
      _main in main.o
  "Rectangle::GetHeight()", referenced from:
      _main in main.o
      _main in main.o
  "Rectangle::~Rectangle()", referenced from:
      _main in main.o
      _main in main.o
      _main in main.o
      _main in main.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
make: *** [rectangle] Error 1

**** Build Finished ****

此外,在构建项目后会自动创建二进制文件吗?

2 个答案:

答案 0 :(得分:1)

您的Rectangle方法的实现确实缺失。

这是方法,您可以在链接器错误消息中看到:

Rectangle::Rectangle()
Rectangle::GetHeight()
Rectangle::GetWidth()    

如果您有一个 Rectangle.cpp (或.cc,.cxx)文件,那么您还需要编译它并链接Rectangle.o文件。

因为你在这里简单地概述了不同的文件名结尾:

  • Rectangle.h 是包含您的类的接口的头文件。通常,只要我阅读并理解这个文件,就可以使用那里定义的类。
  • Rectangle.cpp 是实现或源文件,包含实现。你也可以将它们放在标题中,但是对于较大的类,这会使头文件更加拥挤和一些其他缺点(编译时速度,封装更少......)
  • Rectangle.o 是对象文件。这是编译器从头文件和源文件中生成的内容,由链接器使用。

答案 1 :(得分:0)

您还没有在任何地方定义Rectangle类函数。 Rectangle.c在哪里?

头文件只是声明该类存在,但您没有为该类提供任何定义。你需要一个Rectangle.c来做到这一点。您还必须链接Rectangle.o。