首页 > 解决方案 > 架构 x86_64 的未定义符号:(链接器问题?)

问题描述

我正在做以下问题:

从上次添加到您的 Rectangle 类:

1)创建一个新类TestRect,它是Rectangle的朋友类。在这个类中,实现一个名为 TestRect::tester 的成员函数,它以一个矩形为参数,测试长度和宽度都大于 0。

2) 创建一个 main() 函数,生成三个矩形 r1、r2 和 r3,每个矩形的长度和宽度均为 20。然后在每个矩形上调用 TestRect::tester 函数并打印出结果

我认为我正确地完成了第 1 部分),但第 2 部分)没有给我正在寻找的输出。我不知道如何从我得到的以下输出中修复我的代码:

cppcompile rectEnhanceStaticFriends
Undefined symbols for architecture x86_64:
  "TestRect::tester(Rectangle&)", referenced from:
      _main in rectEnhanceStaticFriends.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
cppcompile:15: no such file or directory: ./rectEnhanceStaticFriends

你能帮我解决一下吗?似乎是链接器问题,我没有找到解决方法。感谢您通读。(Ps:我用 VSC 编译)这是我的代码:

rectEnhanceStaticFriends.cpp

#include <iomanip>
#include <cstring>
#include <string>
#include "rect.h"
using namespace std;

int main()
{

    Rectangle::setYards(100);
    Rectangle r1(20, 20, "Kitchen");
    Rectangle r2(20, 20, "Bathroom");
    Rectangle r3(20, 20, "Office");
    TestRect tr;

    cout << "Test on r1: " << tr.tester(r1) << endl;
    cout << "Test on r2: " << tr.tester(r2) << endl;
    cout << "Test on r3: " << tr.tester(r3) << endl;

    Rectangle house[] = {Rectangle(10, 12, "Kitchen"),
                         Rectangle(20, 20, "Bedroom"),
                         Rectangle(8, 12, "Offce")};

    for (int i = 0; i < 3; i++)
    {

        if (strcmp(house[i].printName(), "Offce") == 0)
        {
            // cout << "oui\n";
            house[i].setName("Office");
        };

        cout << "Area for " << house[i].printName() << " is : " << house[i].getArea() << endl;
    }

    if (house[1].getArea() > house[2].getArea() && house[1].getArea() > house[3].getArea())
    {
        cout << house[1].printName() << " has the biggest area.\n";
    }
    else if (house[2].getArea() > house[1].getArea() && house[2].getArea() > house[3].getArea())
    {
        cout << house[2].printName() << " has the biggest area\n";
    }
    else
    {
        cout << house[3].printName() << " has the biggest area\n";
    }

    //there is an error house[3] go beyond the array..
    return 0;
}

测试矩形.h

#ifndef TESTRECT_H
#define TESTRECT_H

class Rectangle; //forward declaration of class Rectangle

class TestRect
{
public:
    bool tester(Rectangle &);
};

#endif

测试矩形.cpp

#include <iostream> //
#include <iomanip>
#include <string>
#include "testRect.h"
#include "rect.h"

bool TestRect::tester(Rectangle &r)
{
    bool testResult = false;
    if (r.width > 0 && r.length > 0)
        testResult = true;
    return testResult;
}

矩形.h

// Rec header file
#ifndef RECT_H
#define RECT_H
#include "testRect.h"

class Rectangle
{
private:
    double width;
    double length;
    char *name;
    static double yardsAvail; //indicate how many yards of perimeter are available to make rectangle
    void initName(const char *n);
    void initName(const char *n, int size);

public:
    //constructors
    Rectangle();
    Rectangle(double, double,
              const char *);
    //destructor
    ~Rectangle() { delete[] name; };
    void setWidth(double);
    void setLength(double);
    void setWidth(char *);
    void setLength(char *);
    void setName(const char *);
    int getWidth() const;
    int getLength() const;
    double getArea() const;
    char *printName() const
    {
        return name;
    }
    //added parts
    static void setYards(double);
    friend class TestRect;
    friend bool TestRect::tester(Rectangle &);
};
double Rectangle::yardsAvail = 0; //added parts

#endif

矩形.cpp

#include <iostream> //
#include <iomanip>
#include <string>
#include "rect.h"
#include "testRect.h"
using namespace std;

Rectangle::Rectangle()
{
    width = 0;
    length = 0;
    initName("Default");
}

Rectangle::Rectangle(double x, double y, const char *z)
{
    width = x;
    length = y;
    initName(z);

    double yardsReqd = 2 * x + 2 * y;
    if (yardsAvail - yardsReqd < 0)
    {
        cout << "Not enough yard..\n";
        width = 0;
        length = 0;
    }

    yardsAvail -= yardsReqd;
}

void Rectangle::initName(const char *n)
{
    name = new char[258];
    strcpy(name, n);
};

void Rectangle::initName(const char *n, int size)
{
    name = new char[size];
    strcpy(name, n);
};

void Rectangle::setWidth(double w)
{
    width = w;
}

void Rectangle::setLength(double l)

{
    length = l;
}

void Rectangle::setName(const char *newname)
{
    //newname.newName = "Office";
    strcpy(name, newname);
}

double Rectangle::getArea() const
{
    return width * length;
}

//added part
void Rectangle::setYards(double y)
{
    yardsAvail = y;
}

标签: c++compilationlinkersymbolsundefined-symbol

解决方案


推荐阅读