把一个c++源程序,分割为二个.cpp文件和一个.h文件,然后再编写一个makefile,执行make,怎么总是提示找不到类的定义?

lhzsu 发布于 2014/12/12 07:35
阅读 1K+
收藏 0

mm.cpp如下,执行g++ -o mm mm.cpp是可以通过的。现在把它分割三个文件

#include <iostream>
using namespace std;
class Point
{
   public:
     Point(float a=0,float b=0);
     float getX();
     float getY();
   protected:
     float x,y;
};

Point::Point(float a,float b)
{
    x=a;
    y=b;
}
float Point::getX()
{
   return x;
}
float Point::getY()
{
   return y;
}

class Circle:public Point
{
   public:
     Circle(float x=0,float y=0,float r=0);
     void setRadius(float r);
     float getRadius();
     float area();
   protected:
     float radius;
};
Circle::Circle(float a,float b,float r):Point(a,b),radius(r)
{
}
void Circle::setRadius(float r)
{
    radius=r;
}
float Circle::getRadius()
{
   return radius;
}
float Circle::area()
{
   return 3.14159*radius*radius;
}
int main()
{
    Point point(3.2,4.5);
    cout<<"point: ("<<point.getX()<<","<<point.getY()<<")"<<endl;
   
    Circle *circle=new Circle(2.4,1.2,5.6);
    cout<<"Circle的面积area is: "<<circle->area()<<endl;
}

------------------------------------------------------------------------------------

现把上面的文件分割为如下文件,然后编写makefile,make

aa.h如下:

#ifndef aabbcc
#define aabbcc
#include <iostream>
class Point
{
   public:
     Point(float a=0,float b=0);
     float getX();
     float getY();
   protected:
     float x,y;
};

#endif

aa.cpp如下:

#include "aa.h"
Point::Point(float a,float b)
{
    x=a;
    y=b;
}
float Point::getX()
{
   return x;
}
float Point::getY()
{
   return y;
}

circle.h如下


#include "aa.h"
class Circle:public Point
{
   public:
     explicit Circle(float x=0,float y=0,float r=0);
     void setRadius(float r);
     float getRadius();
     float area();
   protected:
     float radius;
};

circle.cpp如下


#include "circle.h"
Circle::Circle(float a,float b,float r)
{
    Point(a,b);
    radius=r;
}
void Circle::setRadius(float r)
{
    radius=r;
}
float Circle::getRadius()
{
   return radius;
}
float Circle::area()
{
   return 3.14159*radius*radius;
}

main.cpp如下


#include "circle.h"
#include "aa.h"

int main()
{
    Point point(3.2,4.5);
    cout<<"point: ("<<point.getX()<<","<<point.getY()<<")"<<endl;
   
    Circle *circle=new Circle(2.4,1.2,5.6);
    cout<<"Circle的面积area is: "<<circle->area()<<endl;
}

上述文件放在一个文件夹中,现编写一个makefile如下


circle:circle.o main.o
 g++ circle.o main.o -o circle
main.o:main.cpp circle.h
 g++ -c main.cpp -o main.o
circle.o:circle.cpp circle.h
 g++ -c circle.cpp -o circle.o
clean:
 rm *.o

然后执行make.

提示


 g++ -c circle.cpp -o circle.o可以通过,但是

执行g++ -c main.cpp -o main.o,提示

执行 g++ circle.o main.o -o circle,提示

不知是什么问题,还请大师多指点,不胜感激!

加载中
0
阿亚
阿亚
你用了cout,但是没看到你using namespace std
0
c
chaosecho

其实你这个应该分4-5个文件更好   

point.h里面放class point 定义

point.cpp放point实现

circle也类似上面 最后再一个Main.cpp

你这里的问题是 没有编译aa.cpp

makefile步骤应该是:

1.g++ -c aa.cpp -o aa.o

2.g++ -c circle.cpp -o circle.o

3.g++ -c main.cpp -o main.o

4.g++ -o circle main.o circle.o aa.o

最上面3步都可以用

%.o:%.cpp

    CC -c $^ -o $@

这么一个规则就替换完了

0
纳兰清风
纳兰清风
aa.cpp没编译啊
0
l
lhzsu

非常感谢,按你的步骤已经解决了。

返回顶部
顶部