Ошибка компоновщика VS2010

Решено Мой "WorkoutGeneratorMain.cpp" был классифицирован IDE как заголовок C++. Я не уверен, почему это произошло, но я исправил это. Теперь я разберусь со всеми остальными ошибками.

Спасибо всем!

===================================================

Я получаю следующую ошибку при компиляции моей программы в Visual Studio 2010 Professional:

------ Начата сборка: Проект: WorkoutGenerator, Конфигурация: Отладка Win32 ------
Сборка начата 15.08.2012, 12:19:18.
InitializeBuildStatus:
Касается " Debug\WorkoutGenerator.unsuccessfulbuild".
ClCompile:
LiftClass.cpp
ManifestResourceCompile:
Все выходные данные обновлены.
MSVCRTD.lib(crtexe.obj): ошибка LNK2019: неразрешенный внешний символ main, указанный в функции __tmainCRTStartup
C:\Users\Shanalex\Documents\Programming\C++Programming\WorkoutGenerator\WorkoutGenerator\Debug\WorkoutGenerator.exe: фатальная ошибка LNK1120: 1 неразрешенные внешние факторы

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

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

У меня есть три файла кода, а именно:

LiftClass.h

//Lift Classes
//Defines the Lift Class


#ifndef LIFTCLASSHEADER_H_INCLUDED
#define LIFTCLASSHEADER_H_INCLUDED

#include <iostream>
#include <string>
#include <vector>
#include <random>
#include <ctime>

using namespace std;

class Lift
{
public:
    string LName;
    string LType;
    string LBody;
    vector<double> LLoadScale;

    Lift(string Name, string Type, string Body, 
        double Pawn, double Bishop, double Knight, double Rook, double Royal);
};

Lift::Lift(string Name, string Type, string Body, 
    double Pawn, double Bishop, double Knight, double Rook, double Royal)
{
    LName = Name,

    LType = Type,

    LBody = Body,

    LLoadScale.push_back(Pawn),
    LLoadScale.push_back(Bishop),
    LLoadScale.push_back(Knight),
    LLoadScale.push_back(Rook),
    LLoadScale.push_back(Royal);
}


#endif

Затем у меня есть реализация .cpp класса lift и функция для их рандомизации.

LiftClass.cpp

//Exercise Randomizer using Lift Class
//Initializes Lifts for use in Workout Generator
//Version 2.0 will reference Database

#include "LiftClass.h"

Lift exerciseRandomizer() //Define database of exercise & randomly select one
{    
    vector<Lift> LiftDatabase;

    Lift Clean("Clean", "Olympic", "Full", .33, .66, 1, 1.33, 1.66);
    Lift Bench("Bench Press", "Heavy", "Upper", .33, .66, 1, 1.5, 2);

    LiftDatabase.push_back(Clean);
    LiftDatabase.push_back(Bench);

    srand(static_cast<unsigned int>(time(0))); //Seed random number

    unsigned randomNumber = rand(); //Generate Random Number

    //Get random between 1 and total lift count
    unsigned randomSelector = (randomNumber % LiftDatabase.size()); 

    return LiftDatabase[randomSelector];
}

И, наконец, у меня есть моя основная функция WorkoutGeneratorMain.cpp.

WorkoutGeneratorMain.cpp

//Workout Generator
//Generates workouts based on goal and fitness level

#include "LiftClass.h"


int main()
{
    exerciseRandomizer();

    Lift LiftA = exerciseRandomizer();

    cout << "\n\nYour first lift is: " << LiftA.LName << "\n\n Its lift type is: " << LiftA.LType << endl;
    cout << "\n\nGood Luck!" << endl;

    system("pause");
    return 0;
}

Любые предложения приветствуются.

Спасибо,

-Алекс


person Alex Hall    schedule 15.08.2012    source источник
comment
Не по теме, но вам следует избегать using namespace std;, особенно в файлах заголовков.   -  person juanchopanza    schedule 15.08.2012
comment
Я вижу, что LiftClass.cpp компилируется: ClCompile: LiftClass.cpp. Но я не вижу такого же сообщения для WorkoutGeneratorMain.cpp. Вы уверены, что он включен в ваш проект?   -  person Lol4t0    schedule 15.08.2012
comment
Вы можете получить эту ошибку, если вы связываетесь с компонентами, которые не используют одну и ту же среду выполнения. Например, однопоточный/многопоточный, отладка/выпуск и т. д.   -  person Peter Ritchie    schedule 15.08.2012


Ответы (1)


Вы могли бы подумать, что int main() является точкой входа исполняемого файла, но это не так (обязательно). :) В зависимости от настроек проекта среда выполнения может вызывать wmain или main. Вот почему вместо этого вы используете _tmain, который представляет собой макрос, расширяющийся до того, что ожидает среда выполнения.

Попробуйте изменить его на:

int _tmain(int argc, _TCHAR* argv[])

PS - это должно было сгенерироваться автоматически, возможно вы его удалили вместо замены содержимого _tmain.

person Luchian Grigore    schedule 15.08.2012
comment
Компилятор должен справиться с этим за вас, основываясь на выбранной вами среде выполнения. Если это не так, проект, вероятно, не имеет подходящей среды выполнения для библиотек, с которыми он связан... - person Peter Ritchie; 15.08.2012
comment
int main() не должно вызывать проблем. _tmain позволяет приложениям Unicode получать аргументы командной строки в виде строк Unicode, но не обязательно использовать _tmain. - person James McNellis; 15.08.2012
comment
@JamesMcNellis будет, если это сгенерированный проект, а IDE уже помещает int main() где-то еще, пытаясь вызвать другую версию, которую не может найти. - person Luchian Grigore; 15.08.2012
comment
@LuchianGrigore: Если у вас есть _tmain, main не будет где-то еще (если только вы, пользователь, не поместите его туда). _tmain — это макрос, который расширяется до main или wmain. - person James McNellis; 15.08.2012
comment
@JamesMcNellis, вы правы, у меня сложилось неправильное представление о том, что MSVS делает в фоновом режиме. Это правильно сейчас? - person Luchian Grigore; 15.08.2012
comment
@LuchianGrigore Нет, я имею в виду время выполнения. Точка входа C является основной, среда выполнения VC поддерживает это путем сопоставления некоторых других основных (_tmain, WinMain и т. д.). Если какой-то main не может быть найден, это обычно указывает на то, что в игре задействовано несколько несовместимых сред выполнения. - person Peter Ritchie; 15.08.2012
comment
Это правильно, но не отвечает на вопрос. В идеале новичкам не следует интересоваться специфическими деталями компилятора, особенно такими уродливыми, как TCHAR. int main() будет работать нормально и является переносимым, поэтому предпочтительнее там, где его можно использовать. - person James McNellis; 15.08.2012