I'm working on a project for school, and after finishing and testing it, I separated it into a file containing my functions, the main function, and a header file. Both the functions and the header compile fine, but when I compile the main, I get the error which is included at the bottom of this post
Here is the main file:
#include "header.h"
using namespace std;
int main()
{
    bool exit = false;
    int idIn;
    //header
    //creates enumerator for menu
    enum CHOICE {add=1, remove=2, display=3, search=4, results=5, quit=6};
    int input;
    //outputs menu
    //switch case for input
    while (!exit)
    {
        cout << "1: Add" << endl;
        cout << "2: Remove" << endl;
        cout << "3: Display" << endl;
        cout << "4: Search" << endl;
        cout << "5: Results" << endl;
        cout << "6: Quit" << endl;
        cout << "Enter choice: ";
        cin >> input;
        switch (input)
        {
            case add:
                add_student();
                break;
            case remove:
                cout << "Enter the id for the student to remove: ";
                cin >> idIn;
                remove_student(idIn);
                if(!removed)
                {
                    cout << "Student does not exist" << endl;
                }
                break;
            case display:
                //naming the function "Display" causes a compile error
                student_display();
                break;
            case search:
                //naming the function "search" causes a compile error
                cout << "Enter the id for the student to search for: ";
                cin >> idIn;
                student_search(idIn);
                if(!found)
                {
                    cout << "Student does not exist" << endl;
                }
                break;
            case results:
                exportResults();
                cout << "Results exported to file: averages.dat" << endl;
                break;
            case quit:
                cout << "Bye" << endl;
                exit = true;
                break;
            default:
                cout << "INVALID ENTRY" << endl;
                break;
        }
    }
    return 0;
}
Here is the function file:
#include "header.h"
using namespace std;
int getNumber()
{
    ifstream fin;
    fin.open("student.dat");
    if (fin.fail())
    {
        cout<<"File error."<<endl;
        exit(1);
    }
    int count=0;
    string line;
    while(!fin.eof())
    {
        getline(fin, line);
        ++count;
    }
    fin.close();
    return(count);
}
int findMinimum(int grades[], int numgrades)
{
    int minimum = grades[0];
    for(int i = 0; i < numgrades; i++)
    {
        if (grades[i] < minimum)
        {
            minimum = grades[i];
        }
    }
    return minimum;
}
void add_student()
{
    studentFile.open("student.dat", ios_base::app);
    if (studentFile.fail())
    {
        cout<<"File error."<<endl;
        exit(1);
    }
    //declarations
    string first;
    string last;
    student newstudent;
    int input;
    //input student info
    cin.ignore();
    cout << "Last name: ";
    getline(cin, last);
    cout << "First name: ";
    getline(cin,first);
    newstudent.name = last + "," + first;
    cout << "Enter the students id number: ";
    cin >> newstudent.id;
    cout << "Enter the number of tests taken: ";
    cin >> newstudent.numTests;
    //inputs testgrades for student
    newstudent.tests = new int[newstudent.numTests];
    for(int i = 0; i < newstudent.numTests; i++)
    {
        cout << "Enter test grade " << i+1 << ": ";
        cin >> newstudent.tests[i];
    }
    //write student info to file
    studentFile << newstudent.name << "," << newstudent.id <<","<< newstudent.numTests << ",";
    //write test grades to file
    for(int i = 0; i < newstudent.numTests; i++)
    {
        studentFile << newstudent.tests[i] << ",";
    }
    studentFile << endl;
    //closes student file
    studentFile.close();
    delete [] newstudent.tests;
}
void remove_student(int id)
{
    int numstudents = getNumber();
    removed = false;
    string intIn;
    string input;
    string first;
    string last;
    //creates dynamic array of students
    student *students;
    students = new student[numstudents];
    //opens students.dat file
    readFile.open("student.dat");
    if (readFile.fail())
    {
        cout<<"File error."<<endl;
        exit(1);
    }
    //cout << "Searching " << numstudents << " students" << endl;
    //scan in student list
    for(int i = 0; i < numstudents; i++)
    {
        student newstudent;
        getline(readFile,input);
        stringstream ss (input);
        getline(ss, first, ',');
        getline(ss, last, ',');
        newstudent.name = first + "," + last;
        getline(ss, intIn, ',');
        newstudent.id = stoi(intIn);
        getline(ss, intIn, ',');
        newstudent.numTests = stoi(intIn);
        newstudent.tests = new int[newstudent.numTests];
        for(int j = 0; j < newstudent.numTests; j++)
        {
            getline(ss, intIn, ',');
            newstudent.tests[j] = stoi(intIn);
        }
        students[i] = newstudent;
    }
    readFile.close();
    studentFile.open("student.dat");
    if (readFile.fail())
    {
        //cout<<"File error on open."<<endl;
        //exit(1);
    }
    for(int i = 0; i < numstudents - 1; i++)
    {
        student out;
        out = students[i];
        if(out.id!=id)
        {
            studentFile << out.name << "," << out.id << "," << out.numTests << ",";
            for(int j = 0; j < out.numTests; j++)
            {
                studentFile << out.tests[j] << ",";
            }
            studentFile << endl;
        }
        else
        {
            removed = true;
        }
    }
    //delete student array
    delete [] students;
    //close open files
    studentFile.close();
}
void student_display()
{
    int numstudents = getNumber();
    string intIn;
    string input;
    string first;
    string last;
    readFile.open("student.dat");
    if (readFile.fail())
    {
        cout<<"File error."<<endl;
        exit(1);
    }
    for(int i = 0; i < numstudents - 1; i++)
    {
        student printStudent;
        getline(readFile,input);
        stringstream ss (input);
        getline(ss, first, ',');
        getline(ss, last, ',');
        printStudent.name = first + "," + last;
        cout << setw(30) << printStudent.name;
        getline(ss, intIn, ',');
        printStudent.id = stoi(intIn);
        cout << setw(15) << printStudent.id;
        getline(ss, intIn, ',');
        printStudent.numTests = stoi(intIn);
        printStudent.tests = new int[printStudent.numTests];
        for(int j = 0; j < printStudent.numTests; j++)
        {
            getline(ss, intIn, ',');
            printStudent.tests[j] = stoi(intIn);
            cout << setw(5) << printStudent.tests[j];
        }
        //students[i] = printStudent;
        cout << endl;
        delete [] printStudent.tests;
    }
    readFile.close();
}
void student_search(int id)
{
    int numstudents = getNumber();
    string intIn;
    string input;
    string first;
    string last;
    found = false;
    readFile.open("student.dat");
    if (readFile.fail())
    {
        cout<<"File error."<<endl;
        exit(1);
    }
    for(int i = 0; i < numstudents - 1; i++)
    {
        student printStudent;
        getline(readFile,input);
        stringstream ss (input);
        getline(ss, first, ',');
        getline(ss, last, ',');
        printStudent.name = first + "," + last;
        getline(ss, intIn, ',');
        printStudent.id = stoi(intIn);
        if(printStudent.id == id)
        {
            cout << printStudent.name;
            cout << setw(15) << printStudent.id;
            getline(ss, intIn, ',');
            printStudent.numTests = stoi(intIn);
            printStudent.tests = new int[printStudent.numTests];
            for(int j = 0; j < printStudent.numTests; j++)
            {
                getline(ss, intIn, ',');
                printStudent.tests[j] = stoi(intIn);
                cout << setw(5) << printStudent.tests[j];
            }
            //students[i] = printStudent;
            cout << endl;
            delete [] printStudent.tests;
            found = true;
        }
    }
    readFile.close();
}
void exportResults()
{
    //decarations.
    int numStudents = getNumber();
    double average;
    double min;
    double sum;
    int calcTests;
    string intIn;
    string input;
    string first;
    string last;
    //opens export file
    expFile.open("averages.dat");
    if(readFile.fail())
    {
        cout << "File error" << endl;
        exit(1);
    }
    //opens read file
    readFile.open("student.dat");
    if (readFile.fail())
    {
        cout<<"File error."<<endl;
        exit(1);
    }
    //scans student file and copys ids and average grade to the export file
    for(int i = 0; i < numStudents - 1; i++)
    {
        //sets values
        sum = 0;
        min = 0;
        //reads student info from file
        student printStudent;
        //sets up string stream
        getline(readFile,input);
        stringstream ss (input);
        //gets name (not saved here)
        getline(ss, first, ',');
        getline(ss, last, ',');
        printStudent.name = first + "," + last;
        //reads and prints id to exp file
        getline(ss, intIn, ',');
        printStudent.id = stoi(intIn);
        expFile << printStudent.id;
        //gets number of tests
        getline(ss, intIn, ',');
        printStudent.numTests = stoi(intIn);
        calcTests = printStudent.numTests;
        //copys grades to new array for the find minimum function
        int grades[printStudent.numTests];
        for(int j = 0; j < printStudent.numTests; j++)
        {
            getline(ss, intIn, ',');
            grades[j] = stoi(intIn);
            //ads grade to sum
            sum += grades[j];
        }
        //gets minimum from getminimum function
        min = findMinimum(grades, calcTests);
        //drop lowest test grade;
        sum -= min;
        //calc average
        average = sum/(printStudent.numTests-1);
        //print grade
        expFile << setprecision(1) << fixed << setw(7) << average << endl;
    }
    //closes files
    readFile.close();
    expFile.close();
}
Here is the header file:
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <iomanip>
using namespace std;
const int TESTS = 5;
ofstream studentFile;
ifstream readFile;
ofstream expFile;
bool removed;
bool found;
struct student
{
    string name;
    int numTests;
    int id;
    int *tests;
    double averageScore;
};
int getNumber();
int findMinimum(int, int);
void add_student();
void remove_student(int);
void student_display();
void student_search(int);
void exportResults();
//int main();
When I compile the main function, I get the following error:
g++ Project2_main.cpp
/tmp/ccKi3gpQ.o: In function `.L4':
cwh0114Project2_main.cpp:(.text+0x26a): undefined reference to `add_student()'
/tmp/ccKi3gpQ.o: In function `.L6':
cwh0114Project2_main.cpp:(.text+0x2aa): undefined reference to `remove_student(int)'
/tmp/ccKi3gpQ.o: In function `.L7':
cwh0114Project2_main.cpp:(.text+0x2f7): undefined reference to `student_display()'
/tmp/ccKi3gpQ.o: In function `.L8':
cwh0114Project2_main.cpp:(.text+0x337): undefined reference to `student_search(int)'
/tmp/ccKi3gpQ.o: In function `.L9':
cwh0114Project2_main.cpp:(.text+0x384): undefined reference to `exportResults()'
collect2: error: ld returned 1 exit status
