1

我确定我只是在原来的课程(会议视图)中遗漏了一些东西,但我无法完全理解所缺少的东西。当我尝试构建包含我的会议视图类的 tst_conferencepage.cpp 文件时,当我尝试实例化类型为会议视图的对象时,我收到一条关于未找到架构 x86_64 的符号的错误消息。

会议视图.h:

#ifndef CONFERENCEVIEW_H
#define CONFERENCEVIEW_H
#include "constants.h"

class conferenceView
{
    QString conference; // Holds the current conference selected by the fan
    QString division;   // Holds the current division selected by the fan
public:
    conferenceView(); // Default Constructor
    void setConference(QString);    // Sets the current conference of the fan
    QString getConference();    // Returns the current conference of the fan
    void setDivision(QString);  // Sets the current division of the fan
    QString getDivision();  // Gets the current division of the fan
    QSqlQuery queryConference(QString); // Returns a query for the teams in a specified conference
    QSqlQuery queryDivision(QString);   // Returns a query for the teams in a specified conference
    QSqlQueryModel* populateView(QString, int); // Returns a QSqlQueryModel index to display the queried data to the table view
};

#endif // CONFERENCEVIEW_H

会议视图.cpp:

#include "conferenceview.h"

conferenceView::conferenceView()
{
    this->conference = "";
    this->division = "";
}

// Assigns conference to passed in QString
void conferenceView::setConference(QString conference) { this->conference = conference; }

// Returns conference
QString conferenceView::getConference() { return this->conference; };

// Assigns division to passed in QString
void conferenceView::setDivision(QString division) { this->division = division; }

// Returns division
QString conferenceView::getDivision() { return this->division; }


QSqlQuery conferenceView::queryConference(QString conference)
{
    this->setConference(conference); // Sets current conference

    // Queries database for team names by conference order by team name
    QSqlQuery q;
    q.prepare("SELECT TeamName "
              "FROM TeamInfo "
              "WHERE Conference = :conf "
              "ORDER BY TeamName");
    q.bindValue(":conf", conference);
    q.exec();

    return q;
}

QSqlQuery conferenceView::queryDivision(QString division)
{
    // Sets current division
    if( this->conference == "American Football Conference")
        this->setDivision(division.prepend("AFC "));
    else
        this->setDivision(division.prepend("NFC "));

    // Queries database for team names by division order by team name
    QSqlQuery q;
    q.prepare("SELECT TeamName "
              "FROM TeamInfo "
              "WHERE Division = :div "
              "ORDER BY TeamName");
    q.bindValue(":div", division);
    q.exec();

    return q;
}

QSqlQueryModel* conferenceView::populateView(QString str, int id)
{
    QSqlQueryModel* qModel = new QSqlQueryModel;

    // if id == 0, sets the qModel to the conference teams
    if(id == 0)
    {
        this->setConference(str);
        qModel->setQuery(this->queryConference(this->getConference()));
    }
    // if id == 1, sets the qModel to the division teams
    else
    {
        this->setDivision(str);
        qModel->setQuery(this->queryDivision(this->getDivision()));
    }

    // Sets the header title of the table view
    qModel->setHeaderData(0, Qt::Horizontal, QObject::tr("Team Name"));

    return qModel;
}

tst_conferencepage.cpp:

#include <QtTest>
#include "../NFL_Teams_App/conferenceview.h"

class ConferencePage : public QObject
{
    Q_OBJECT
    QVector<QString> AFC;
public:
    ConferencePage();
private slots:
    void testAFCConference();
};

ConferencePage::ConferencePage()
{
    this->AFC = {"Baltimore Ravens", "Buffalo Bills", "Cincinnati Bengals",
                 "Cleveland Browns", "Denver Broncos", "Houston Texans",
                 "Indianapolis Colts", "Jacksonville Jaguars", "Kansas City Chiefs",
                 "Los Angeles Chargers", "Miami Dolphins", "New England Patriots",
                 "New York Jets", "Oakland Raiders", "Pittsburgh Steelers", "Tennessee Titans"};
}

void ConferencePage::testAFCConference()
{
    conferenceView c;
    QSqlQuery query = c.queryConference("American Football Conference");
    int index = 0;
    while(query.next())
        QVERIFY(this->AFC.at(index) == query.value(index));
}

ConferencePage::testAFCConference() 中的阻塞代码是我实例化一个conferenceView 类型的对象的地方,并且错误源于此。

UnitTests.pro:

QT += core testlib sql
QT -= gui

TARGET = UnitTests

CONFIG += qt console warn_on depend_includepath testcase
CONFIG -= app_bundle

TEMPLATE = app

SOURCES += \ 
    tst_conferencepage.cpp

项目层级:

完整的错误信息:

架构 x86_64 的未定义符号:
“conferenceView::queryConference(QString)”,引用自:tst_conferencepage.o 中的 ConferencePage::testAFCConference() “conferenceView::conferenceView()”,引用自:tst_conferencepage 中的 ConferencePage::testAFCConference()。 o ld:未找到架构 x86_64 的符号 clang:错误:链接器命令失败,退出代码 1(使用 -v 查看调用)make[1]: * [UnitTests] 错误 1 ​​make:* [sub-UnitTests- make_first] Error 2 01:21:30: The process "/usr/bin/make" exited with code 2. Error while building/deploying project NFLTeamsProject (kit: Desktop Qt 5.11.2 clang 64bit) When execution step "Make"

任何帮助表示赞赏,在此先感谢您!

4

1 回答 1

0

你在你的文件中丢失了conferenceview.cpp,所以链接器不知道你的测试应该从什么构建。您的文件应如下所示:conferenceview.hUnitTest.pro.pro

QT += core testlib sql
QT -= gui

TARGET = UnitTests

CONFIG += qt console warn_on depend_includepath testcase
CONFIG -= app_bundle

TEMPLATE = app

VPATH = "../NFL_Teams_App"

SOURCES += \ 
    tst_conferencepage.cpp \
    conferenceview.cpp

HEADERS += \
    conferenceview.h
于 2018-11-12T09:47:46.920 回答