Ошибка компилятора DevC++

Я должен написать тестовую программу, которая проверяет различные операции над классом, разработанные в предыдущей задаче; показывая определение clockType перегрузки как функций-членов. Я получаю следующую ошибку, когда компилирую ее с помощью компилятора Dev C++.

Ошибка гласит:

[link error] undefined reference "WinMain@16'
Id returned 1 exit status

Это мой код:

#include <iostream>

using namespace std;

class clockType
{
public:
      void setTime (int hours, int minutes, int seconds);
      void getTime (int& hours, int& minutes, int& seconds) const;     
      clockType operator++();
      bool operator==(const clockType& otherClock) const;
      bool operator!= (const clockType& otherClock) const;
      bool operator<=(const clockType& otherClock) const;
      bool operator<(const clockType& otherClock) const;
      bool operator>=(const clockType& otherClock) const;
      bool operator>(const clockType& otherClock) const;
      clockType ();
      clockType (int hours = 0, int minutes = 0, int seconds = 0);
private:
        int hr;
        int min;
        int sec;
};
clockType clockType::operator++()
{
          sec++;
          if (sec > 59)
          {
                  sec = 0;
                  min++;
                  if (min > 59)
                  {
                          min = 0;
                          hr++;
                          if (hr > 23)
                          hr = 0;
                  }
          }
          return *this;
}
bool clockType::operator==(const clockType& otherClock) const
{
     return (hr == otherClock.hr && min == otherClock.min && sec == otherClock.sec);
}
bool clockType::operator<=(const clockType& otherClock) const
{
     return ((hr < otherClock.hr) || (hr == otherClock.hr && min < otherClock.min) || (hr == otherClock.hr && min == otherClock.min && sec <= otherClock.sec));
}
bool clockType::operator!=(const clockType& otherClock) const
{
          return (hr != otherClock.hr || min != otherClock.min || sec != otherClock.sec);
}
bool clockType::operator<(const clockType& otherClock) const
{
     return ((hr < otherClock.hr) || (hr == otherClock.hr && min < otherClock.min) || (hr == otherClock.hr && min == otherClock.min && sec < otherClock.sec));
}
bool clockType::operator>=(const clockType& otherClock) const
{
     return ((hr > otherClock.hr) || (hr == otherClock.hr && min > otherClock.min) || (hr == otherClock.hr && min == otherClock.min && sec >= otherClock.sec));
}
bool clockType::operator>(const clockType& otherClock) const
{
     return ((hr > otherClock.hr) || (hr == otherClock.hr && min > otherClock.min) || (hr == otherClock.hr && min == otherClock.min && sec > otherClock.sec));
}

void clockType::setTime(int hours, int minutes, int seconds)
{
     if (0 <= hours && hours < 24)
     hr = hours;
     else
     hr = 0;
     if (0 <= minutes && minutes < 60)
     min = minutes;
     else
     min = 0;
     if (0 <= seconds && seconds < 60)
     sec = seconds;
     else
     sec = 0;
}
void clockType::getTime(int& hours, int& minutes, int& seconds)const
{
   hours = hr;
   minutes = min;
   seconds = sec;
}
clockType::clockType(int hours, int minutes, int seconds)
{
 setTime(hours, minutes, seconds);
}

Любая помощь по этому вопросу будет принята с благодарностью. Я не очень хорошо разбираюсь в программировании, и я просто не могу понять, почему я получаю этот тип ошибки. В других моих программах, которые я до сих пор писал для занятий, этого не было.


person user1592770    schedule 11.08.2012    source источник
comment
Как вы строите свою программу? Похоже, вам не хватает функции main().   -  person Carl Norum    schedule 12.08.2012
comment
Не существует такого компилятора C++, как DevC++.   -  person    schedule 12.08.2012
comment
Вы имеете в виду Visual Studio вместо DevC++?   -  person joce    schedule 12.08.2012
comment
@Joce: он имеет в виду gcc. Но, к сожалению, он этого не знает...   -  person    schedule 12.08.2012
comment
Пожалуйста, избегайте Dev-C++, если вы используете оригинальную версию Bloodshed. Это устарело и, по крайней мере, чрезвычайно проблематично. Соответствующая вики тегов содержит дополнительную информацию.   -  person Bart    schedule 12.08.2012


Ответы (3)


Совершенно точно существует IDE под названием Dev-C++, созданная компанией Bloodshed, я считаю, что она снята с производства, но все еще довольно совместима и популярна, поскольку она бесплатна и проста в использовании с приятным интерфейсом.

Что касается вопроса OP, вы должны быть уверены, что у вас есть точка входа в приложение, в настройках вашего проекта (я не использовал Dev-C++ в течение многих лет, так что осмотритесь), вы найдете что-то вроде типа приложения, параметры в списке будет что-то вроде

Console Application
GUI Application or maybe Win32 Application
Static Library
Dynamic Library

Это все разные типы приложений, и похоже, что по умолчанию ваша программа имеет настройку приложения Win32, в этом случае компоновщик ищет WinMain, однако вы не предоставили его в своем проекте, если вы хотите простое консольное приложение, измените тип приложения для этого параметра, для которого потребуется простая основная функция, примеры функций точки входа приложения для Win32 и консоли:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iShow)
{
return 0;
}

Или для простого консольного приложения

int main(int argc, char* argv[])
{
return 0;
}

К этим функциям вам нужно подключить остальную часть вашего приложения, чтобы оно что-то делало, без этой точки входа ваше приложение даже не может быть должным образом скомпилировано и слинковано.

Пример того, как ваше приложение фактически использует ваш класс (без использования каких-либо функций)

int main(int argc, char* argv[])
{
   clockType  myClockType;
   myClockType.setTime(12, 30, 45);

   return 0;
}
person user1294021    schedule 11.08.2012
comment
Dev-C++ противоположен предпочтительному. Это отвратительная мерзость, с которой никто никогда не должен связываться. - person Puppy; 12.08.2012
comment
Это мнение, Dev-C++ может быть устаревшим, но это очень хорошо построенная IDE с отличной системой пакетов дополнений, хорошим автозаполнением и в какой-то момент хорошей совместимостью. Просто сказать, что это мерзость без причины, не является хорошим ответом. - person user1294021; 16.08.2012
comment
Они проделали хорошую работу, создав альтернативную IDE для использования в Windows, мне бы очень хотелось увидеть вашу IDE, которую вы создали, и насколько она хороша. Dev-C++ также был самым простым в использовании с GTK в Windows, однако, поскольку он больше никогда не будет построен, я полагаю, что он полностью выпадет из области удобства использования. - person user1294021; 16.08.2012

Вам не хватает функции int main(). Класс на самом деле не компилируется в программу сам по себе, вы можете скомпилировать его в DLL, но не в исполняемый файл без функции main. Точнее, программа скомпилируется, но компоновщик жалуется, что ему нужна точка входа для программы.

Если вы поместите это внизу своей программы: однако это просто приведет к исчезновению неопределенной ссылки.

int main(){
    return 0;
}

Чтобы на самом деле протестировать вашу программу, вам нужно будет запустить несколько тестов, например, что-то вроде этого:

#include <iostream>

// your class code here.

int main(){
    Clocktype clock;
    clock.setTime(15, 42, 13);
    int h, m, s;
    clock.getTime(&h, &m, &s);
    std::cout << h << m << s << std::endl;
    return 0;
}
person Rivasa    schedule 11.08.2012
comment
Предлагаемое вами решение правильно в том смысле, что оно устранит ошибку, но вызовет больше проблем для ОП, поскольку его программа по-прежнему ничего не делает. - person Carl Norum; 12.08.2012
comment
Хорошо, теперь я вижу, чего мне не хватало, на самом деле мне не хватает всей исполняемой программы! Где он на самом деле берет назначенные переменные и запускает их через тесты! Спасибо, я знал, что не должен получать что-то подобное, но на самом деле я не был в этом достаточно, чтобы понять, почему. Спасибо. - person user1592770; 12.08.2012
comment
Нет проблем, у меня тоже бывает. - person Rivasa; 12.08.2012
comment
А, &h, &m, &s? Для ссылок? - person Puppy; 12.08.2012
comment
Это необходимо, так как функция ожидает ссылку. void clockType::getTime(int& hours, int& minutes, int& seconds) - person Rivasa; 12.08.2012

Это не компилятор, а ошибка компоновки, она говорит, что компоновщик пытается найти основную функцию (чтобы предоставить точку входа для приложения Windows).

Сама компиляция работает хорошо (шаг компоновки работает после успешной компиляции).

person SJuan76    schedule 11.08.2012
comment
Хорошо, я понимаю, что вы говорите об ошибке связывания, и когда я искал ответы, прежде чем я увидел int main () { return 0; }, однако это пример из моей книги, и он не использует int main в книге... В случае, подобном выше, где бы я мог применить эту часть, я попробовал это в разных местах и ​​получил разные ошибки. - person user1592770; 12.08.2012
comment
Вы пишете класс и компилируете его; он транслируется в машинный код. Этот машинный код может заканчиваться частью библиотеки (статической .lib или динамической .dll/.so) или программой. В случае программы ей нужна точка входа, определяемая файлом main. Чтобы получить библиотеку или программу из машинного кода, вы должны передать компоновщику необходимые параметры (я тоже не помню, какие нужно было указать, я давно не использовал C++, и в основном IDE их упрощают) - person SJuan76; 12.08.2012