1

I have read: undefined reference to `WinMain@16' & still don't understand my problem.

I had a program that was working. Added a class but had not implemented it into the program yet just wrote the header and .cpp file. The program previous to just adding this class worked and now it doesn't.

Error states... **file address....libmingw.32.a(main.o):main.c:(.text.startup+0xa7)

Header file

        #ifndef DATE_H
        #define DATE_H

        #include <iostream>
        #include <string>

        class Date
        {
            public:
                Date();

                //Setters
                void SetDay(unsigned dy);

                void SetMonth(std::string month);

                void SetYear(unsigned mnth);

                //Getters
                unsigned GetDay() const;

                std::string GetMonth() const;

                unsigned GetYear() const;

            private:
                unsigned day, year;
                std::string month;
        };

        #endif // DATE_H

.cpp file

        #include "Date.h"

        Date::Date()
        {
            day = 0;
            year = 0;
            month = "Not Set";
        }

        //Setters
        void Date::SetDay(unsigned dy)
        {
            day = dy;
        }

        void Date::SetMonth(std::string mnth)
        {
            month = mnth;
        }

        void Date::SetYear(unsigned yr)
        {
            year = yr;
        }

        //Getters
        unsigned Date::GetDay() const
        {
            return day;
        }

        unsigned Date::GetYear() const
        {
            return year;
        }

        std::string Date::GetMonth() const
        {
            return month;
        }

my main which I call it in, just because I wasn't sure if the error was because it wasn't being called or something like that is:

        #include <iostream>
        #include <fstream>
        #include "unit.h"  // Unit class declaration
        #include "regist.h"  // Registration class declaration
        #include "date.h"

        using namespace std;

        // Main program:
        // Open an input file stream, read a Registration object,
        // including its list of courses. Redisplay all information,
        // and calculate the total credits taken. Write the results
        // to a file stream.


        int main()
        {
            ifstream infile( "testin.txt" );
            if( !infile ) return -1;

            Registration R;
            Date D;
            infile >> R;

            ofstream ofile( "testout.txt" );

            ofile   << R;

            cout << "\nComputation completed. Check output file. \n";
            cout << "\n Day is " << D.GetDay;

            return 0;
        }

Day does not get set in the overloaded >> operator relating to Registration. It is set by the basic constructor.

Again I haven't added this class in to the program as it is going to be I'm just trying to compile after it was write and added in a basic testing manner. Testing through main.

Thanks in advance. =D

Community
  • 1
  • 1
  • So it works with just a main function, but not with the class added. Are you sure you compiled and linked both .cpp files together? – chris Apr 02 '15 at 04:30
  • Even if the class isn't linked and it just is part of the project but not used. It still has the same error. – Master Sketchiggle Apr 02 '15 at 06:54
  • Is it possible that there is already a lib called date.h and thus is having an error? – Master Sketchiggle Apr 03 '15 at 01:54
  • That shouldn't cause a missing main function. The only thing I really have is that the main file isn't being linked. I've certainly used `int main()` with a Windows subsystem and MinGW before. – chris Apr 03 '15 at 02:01

2 Answers2

2

The problem is that your new project has been created as a Win32 GUI project, when it should have been created as a Console application. The former requires that a function with the signature int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) exists, while the latter requires one of the usual form taken for C or C++ projects, namely int main() or int main(char *argv[], int argc).

Either create a new project of the console type and copy your code into it, or use the 'sticky-tape' solution, and change int main() to int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) You would also need to navigate to the project's properties and change the Build Target from GUI application to Console application - failing to do so would mean that you would not see any output, since you're using cout, which prints to stdout, which is shown by the console. This window is always available for a console application, but is only available for the Debug version of a GUI application.

I reccomend doing it properly and creating a new project of the appropriate type, namely a Console application. :)

enhzflep
  • 12,927
  • 2
  • 32
  • 51
0

Change the type of your application under your project settings to Console. WinMain16 is related to Windows graphical applications. I believe you do need to set a special preprocessor flag or include a library of some sort to get it to work properly if you keep it as a Windows graphical application, but in this case, the easiest fix would be to just get a console application.

Also, maybe adding the -mwindows flag can help you.

CinchBlue
  • 6,046
  • 1
  • 27
  • 58