Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

"1 unresolved externals" C++

Tags:

c++

visual-c++

I've checked the connections between all of my files, as well as Class and Function definitions, but every time I try to run my program it stops me and tells me that it has "1 unresolved externals".

The program is supposed to open up multiple files (A "student" file, and a "grades" file), read from them, and then use a "query file" to look through the data, find the students asked for in the query file, and print it to a new file. Confusing? Yes.

Still, I'm pretty close to a solution, but because I'm using Visual Studio it won't even let me run the program until I find and put an end to the "1 unresolved externals". It won't even tell me where the error is. I'm fairly new to C++, and no matter how hard I search, I can't seem to remedy the issue.

Here's my Main Program:

#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <fstream>

#include "Student.h"

using namespace std;

int main(){



    //Request a file to read from, and open it (I haven't declared the files yet, don't worry about that)
    ifstream input_file;
    string studentfile = "";
    string gradefile = "";
    string queryfile = "";


    //Create a Map for the Students
    map<string, Student *> student_map;

    //Open the Student file and load it in
    cout << "Loading \"" << studentfile << "\"... " <<endl;
    input_file.open(studentfile);

    //Look for:
    string id_number;
    string name;
    string address;
    string phone;

    //Boolean value to check for duplicate students
    bool duplicate = false;

    //Check to see if the Student File is empty
    if (!input_file.eof()){ 

        while (input_file.good()){
            //Get the ID Number
            input_file.get();
            getline (input_file, id_number);

            //Sort through and make sure there are no duplicate students
            for (map<string, Student *>::iterator counter = student_map.begin(); counter != student_map.end(); counter ++){
                if (counter->first == id_number ){
                    duplicate = true;
                    counter = student_map.end();
                }
            }

            if (duplicate != true){
                //Get the name
                input_file.get();
                getline (input_file, name);

                //Get the Address
                input_file.get();
                getline (input_file, address);

                //Get the Phone Number
                input_file.get();
                getline (input_file, phone);

                //Create a new student                                                          
                Student * newStudent = new Student (id_number, name, address, phone);

                //Add it to the map (referenced by the ID number)
                student_map[id_number] = newStudent;
            }
        }
    }

    else {
        return 0;
    }
    input_file.close();

    //Open the Grades file and load it in
    cout << "Loading \"" << gradefile << "\"... " <<endl;
    input_file.open(gradefile);

    //Look for (id_number already defined):
    string course;
    string grade;

    if (!input_file.eof()){

        while (input_file >> course >> id_number >> grade){
            //Find the student referenced
            Student* current_student = student_map[id_number];
            //Calculate their grade points and add them to their grade point vector
            current_student ->add_grade_points(current_student ->check_grade_points(grade));
        }
    }

    else {
        return 0;
    }
    input_file.close();

    //Open the Query file and load it in
    cout << "Loading \"" << queryfile << "\"... " << endl;
    input_file.open(queryfile);

    if (!input_file.eof()){

        //Write to
        ofstream output_file ("report.txt");

        //No need to "Look for" anything, id_number alread defined

        //If the file is open, write to it
        if (output_file.is_open())
        {
            while (input_file >> id_number)
            {
                //Print the ID Number (With four spaces)
                output_file << id_number << "    ";

                //Print out the GPA (With four spaces)
                Student* current_student = student_map[id_number];
                output_file << current_student->get_gpa() << "    ";

                //Print out the student's name (Then end that line)
                output_file << current_student->get_name() << endl;
            }
        }
        input_file.close();
        output_file.close();
    }

    else {
        return 0;
    }


    cout << endl;
    cout << "File Printed.";

    return 0;
}

Here's my "Student" Class (Header File):

#pragma once
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <fstream>
#include <map>

using namespace std;

class Student
{
public:
    Student (string _id_number, string _name, string _address, string _phone);

    void add_grade_points (double grade_points);
    double check_grade_points (string grade);

    double get_gpa () const;
    string get_name () const;

private:
    string id_number;
    string name;
    string address;
    string phone;

    vector <double> grade_points;
};

And finally, my class functions:

#include "Student.h"

Student::Student (string _id_number, string _name, string _address, string _phone){
    id_number = _id_number;
    name = _name;
    address = _address;
    phone = _phone;
}

void Student::add_grade_points (double new_grade_point){
    grade_points.push_back(new_grade_point);
}

double Student::check_grade_points (string grade) {
    if (grade == "A")
        return 4.0;
    else if (grade == "A-")
        return 3.7;
    else if (grade == "B+")
        return 3.4;
    else if (grade == "B")
        return 3.0;
    else if (grade == "B-")
        return 2.7;
    else if (grade == "C+")
        return 2.4;
    else if (grade == "C")
        return 2.0;
    else if (grade == "C-")
        return 1.7;
    else if (grade == "D+")
        return 1.4;
    else if (grade == "D")
        return 1.0;
    else if (grade == "D-")
        return 0.7;
    else
        return 0.0;
}

double Student::get_gpa() const{
    //Add up all of the grade points
    double total = 0;

    for (int i = 0; i < grade_points.size(); i++) {
        total = total + grade_points[i];
    }

    //Calculate the Grade Point Average
    double gpa = total/grade_points.size();

    return gpa;
}

string Student::get_name() const{
    return name;
}

Any help would be so amazing!

EDIT: Here's the error message that comes up:

1>MSVCRTD.lib(crtexew.obj) : error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup
1>C:\Users\Student\Documents\Visual Studio 2010\Projects\CS235 Project 1\Debug\CS235 Project 1.exe : fatal error LNK1120: 1 unresolved externals
like image 896
Brian Avatar asked Feb 16 '26 20:02

Brian


1 Answers

You are trying to compile a program with the standard entry point (int main()) as a windows GUI application, and Windows GUI applications require

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmd, int nShow)

Instead.

Changing your entry point to this won't help you though, as you're trying to compile (what's called in the Visual Studio world) a 'console program'. When you set up the project, there would have been an option to create a console project. You can scrap the one you've got and create a new console project to paste your code into for an easy fix. If you're really attached to your current project though, you can fix it.

In the project settings: Under Configuration Properties > C/C++ > Preprocessor, change the _WINDOWS; string in the Preprocessor definitions to _CONSOLE; and under Configuration Properties > Linker > System, change the SubSystem to Console.

like image 85
twsaef Avatar answered Feb 18 '26 11:02

twsaef



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!