【问题标题】:c++ header files, Undefined symbols for architecture x86_64c++ 头文件,架构 x86_64 的未定义符号
【发布时间】:2017-08-07 00:42:18
【问题描述】:

我正在尝试构建一个程序来用 C++ 存储学生的成绩。编译时收到以下错误:

Undefined symbols for architecture x86_64: "grade1(Student_records const&)", referenced from:
 _main in gradereport-a0007a.o

 "compare(Student_records const&, Student_records const&)", 

referenced from: _main in gradereport-a0007a.o

"read_info(std::__1::basic_istream<char, std::__1::char_traits<char> >&, Student_records&)", 

referenced from: _main in gradereport-a0007a.o

ld: symbol(s) not found for architecture x86_64

我一直(尝试)用来编译的命令:g++gradereport.cpp

他们告诉我关于我的 read_info、compare 和grade1 函数的某些内容是错误的(定义不正确)。但是,我似乎找不到问题。

通过阅读有关“未定义符号”问题的先前帖子,似乎(a)我的函数声明不匹配或(b)我需要“同时”编译多个文件(因为缺乏更好的短语)。我很确定它不是(a)。如果(b),我将如何精确地完成这项任务?另外,如果有人有任何基本的批评,我很想听听。提前致谢。

这是我的代码:

成绩报告.cpp

#include<iostream>
#include<ios>
#include<iomanip>
#include<algorithm>
#include<vector>
#include<stdexcept>
#include "student_records.h"
#include "Grades.h"

using std::cout;
using std::endl;
using std::vector;
using std::cout;
using std::cin;
using std::string;
using std::max;
using std::domain_error;

int main()
{

    vector<Student_records> students; 
    Student_records record; 
    string::size_type maxlen = 0;

    while(read_info(cin, record))
    {

        maxlen = max(maxlen, record.name.size()); // finds the longest name
        students.push_back(record); // enters each record into the vector

    }

    sort(students.begin(), students.end(), compare); 
    for(vector<Student_records>::size_type i = 0; i != students.size(); ++i)
    {

        cout << students[i].name
            << string(maxlen + 1 - students[i].name.size(), ' ');

        try
        {

            double final_grade = grade1(students[i]);
            /* need to define grade function:
                1) unpack grades;
                2) find homework grades;
                3) find final grade;
            */
            cout << final_grade

        }

        catch(domain_error e)
        {

            cout << e.what();

        }

        cout << endl;

    }

    return 0;

}

student_records.h

#ifndef GUARD_STUDENT_RECORDS
#define GUARD_STUDENT_RECORDS

#include<iostream>
#include<string>
#include<vector>

struct Student_records
{

    std::string name;
    double midterm, final;
    std::vector<double> homeworks;

};

bool compare(const Student_records&, const Student_records&);
std::istream& read_info(std::istream&, Student_records&);
std::istream& read_homework(std::istream&, std::vector<double>&);

#endif

student_records.cpp

#include "student_records.h"

bool compare(const Student_records& x, const Student_records& y)
{

    return x.name < y.name;

}

std::istream& read_info(istream& is, Student_records& s)
{

    std::cout << "Enter name, midterm, and final: ";
    is >> s.name >> s.midterm >> s.final;

    read_homework(std::istream&, std::vector<double>&);

    return is;

}

std::istream& read_homework(std::istream& in, std::vector<double>& homework)
{

    cout << "Enter homework: ";

    if(in)
    {
        hw.clear()

        double x;
        while(in >> x)
            homework.push_back(x);

        in.clear();
    }

    return in;

}

成绩.h

#ifndef GUARD_GRADES
#define GUARD_GRADES

#include<iostream>
#include<vector>
#include<string>
#include "student_records.h"

double grade1(const Student_records&);
double grade2(double, double, std::vector<double>);
double median(std::vector<double>);

#endif

成绩.cpp

#include<stdexcept>
#include<vector>
#include "grades.h"
#include "Student_records.h"

using std::domain_error;
using std::vector;

double grade2(double midterm, double final, std::vector<double> homework)
{

    double final_homework_grade;

    final_homework_grade = median(homework);

    return .4 * final_homework_grade + .4 * final + .2 * midterm;

}

double median(vector<double> homework)
{

    typedef vector<double>::size_type vec_sz;

    vec_sz size = homework.size();

    if(size == 0)
        throw domain_error("student has done no homework");

    sort(homework.begin(), homework.end());

    return size % 2 == 0 ? ((homework[mid] + homework[mid + 1]) / 2) : homework[mid];

}

double grade1(const Student_records& s) // unpacks grades
{

    return grade2(s.midterm, s.final, s.homework);

}

【问题讨论】:

标签: c++ compilation


【解决方案1】:

这个问题已经在这个forum解决了。

出现问题是因为您没有编译所有 .cpp 或 .cc 文件,因此编译器无法识别您的头文件添加的包含。

我希望这对某人有所帮助。

【讨论】:

    猜你喜欢
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 2012-07-20
    相关资源
    最近更新 更多