体系结构x86_64的未定义符号(复制构造函数)

时间:2014-04-20 06:12:50

标签: c++ xcode compiler-construction

我试图修复返回空向量的函数。我做了一些谷歌搜索,它显示我需要一个类Point的复制构造函数,我一直收到这个错误:

Undefined symbols for architecture x86_64:   "Point::Point(Point const&)", referenced from:
      Core::render() in Week3_T.o
      Core::sortTriVertices(Point&, Point&, Point&) in Week3_T.o
      Core::decompose(std::__1::vector<Point, std::__1::allocator<Point> >) in Week3_T.o
      Core::drawTriangle(Point, Point, Point) in Week3_T.o
      Core::clipedge(std::__1::vector<Point, std::__1::allocator<Point> >, int, int, int, int) in Week3_T.o
      std::__1::enable_if<__is_forward_iterator<Point*>::value, void>::type std::__1::vector<Point, std::__1::allocator<Point>
>::__construct_at_end<Point*>(Point*, Point*) in Week3_T.o
      void std::__1::vector<Point, std::__1::allocator<Point> >::__push_back_slow_path<Point const>(Point const&) in Week3_T.o
      ... ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

和我的班级:

class Point
{
public:
    int x;
    int y;
    Uint8 r;
    Uint8 g;
    Uint8 b;
    Point(int x, int y, Uint8 r, Uint8 g, Uint8 b) : x(x), y(y), r(r), g(g), b(b) {}
    Point& operator=(Point const &np){
        x=np.x;
        y=np.y;
        r=np.r;
        g=np.g;
        b=np.b;
        return *this;
    }
    Point(const Point& );
    Point(){}


};

和代码片段:

std::vector<Point> Core::clipedge(vector<Point> polygon, int x0, int y0, int x1, int y1)
{

    int r=rand()%255;
    int g=rand()%255;
    int b=rand()%255;
    // For each side of the polygon, check the 4 cases of sutherland-hodgman.
    // Creating a temporary buffer to hold your new set of vertices for the clipped polygon.
    std::vector<Point> temp;
    temp.push_back(Point(1,2,255,255,255));
    int size = (int)polygon.size();

    for (int i = 0; i < size; ++i) {
       {....}
       //push_back clipped point
       temp.push_back(p1);
       {....}
    }
    return temp;

系统是OSX10.9.2,ide是xcode5.1.1编译器是apple llvm5.1

我需要做些什么来解决这个问题?谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

正如在其他答案中指出的那样,您没有提供Point::Point(const Point&)的定义,但您已在Point类定义中声明了它。但是你的类不需要特殊的复制和赋值处理,所以你的问题的解决方案是来提供缺少的定义,但要删除复制构造函数的声明。也删除赋值运算符:

class Point
{
public:
    int x;
    int y;
    Uint8 r;
    Uint8 g;
    Uint8 b;
    Point(int x, int y, Uint8 r, Uint8 g, Uint8 b) 
    : x(x), y(y), r(r), g(g), b(b) {}
};

编译器合成的版本将做正确的事情。

答案 1 :(得分:0)

您可能没有在* .C文件中定义Point(const Point& ); .... 它编译,因为你已在* .h文件中声明,但在尝试链接时失败,因为代码的其他部分引用的符号在目标文件或库中找不到。