Ошибка LNK2019: неразрешенный внешний символ _main, указанный в функции ___tmainCRTStartup
Я не знаю, что с ним не так... Я не могу найти, где находится ошибка, комментирование реализации также не устраняет ошибку.
Заголовочный файл
#ifndef MAIN_SAVITCH_SEQUENCE_H
#define MAIN_SAVITCH_SEQUENCE_H
#include <cstdlib> // Provides size_t
namespace main_savitch_3
{
class sequence
{
public:
// TYPEDEFS and MEMBER CONSTANTS
typedef double value_type;
typedef std::size_t size_type;
static const size_type CAPACITY = 30;
// CONSTRUCTOR
sequence( );
// MODIFICATION MEMBER FUNCTIONS
void start( );
void advance( );
void insert(const value_type& entry);
void attach(const value_type& entry);
void remove_current( );
// CONSTANT MEMBER FUNCTIONS
size_type size( ) const;
bool is_item( ) const;
value_type current( ) const;
private:
value_type data[CAPACITY];
size_type used;
size_type current_index;
};
}
#endif
Источник
#include "sequence1.h"
#include <assert.h>
namespace main_savitch_3
{
// Default constructer - sequence is empty
sequence::sequence()
{
used = current_index = 0;
}
// Start the iteration
void sequence::start()
{
current_index = 0;
}
// Iterate
void sequence::advance()
{
current_index++;
}
// Number of items in the sequence
sequence::size_type sequence::size() const
{
return used;
}
// Checks if there is a current item
bool sequence::is_item() const
{
return current_index <= used && used > 0;
}
// Returns the current value
sequence::value_type sequence::current() const
{
assert(is_item()); // no current item
return data[current_index];
}
// Adds an item BEFORE the current index
void sequence::insert(const value_type& entry)
{
assert(entry != 0); // pointer is invalid
assert(current_index < sequence::CAPACITY); // no room to add an item
// move items up - starting with the last item and working down to the current item
// arrays start at 0, so the -1 adjusts it
for (size_type i = used - 1; i >= current_index; i--)
data[i + 1] = data[i];
data[current_index] = entry;
}
// Adds an item AFTER the current index
void sequence::attach(const value_type& entry)
{
assert(entry != 0); // pointer is invalid
assert(current_index < sequence::CAPACITY); // no room to add an item
// move items up - starting with the last item and working down to the current item
// arrays start at 0, so the -1 adjusts it
for (size_type i = used - 1; i > current_index; i--)
data[i + 1] = data[i];
if (current_index = 0)
data[used] = entry;
else
data[current_index + 1] = entry;
}
// Removes the current item
void sequence::remove_current()
{
for (size_type i = current_index; i < used; i++)
data[i] = data[i + 1];
}
}
17 ответов
Даже если ваш проект имеет main()
метод, компоновщик иногда запутывается. Вы можете решить эту проблему в Visual Studio 2010, перейдя в
Проект -> Свойства -> Свойства конфигурации -> Компоновщик -> Система
и меняется SubSystem
утешить.
У нас тоже была эта проблема. Мой коллега нашел решение. Оказалось, что это переопределение "main" в стороннем заголовке библиотеки:
#define main SDL_main
Таким образом, решение было добавить:
#undef main
перед нашей основной функцией.
Это явно глупость!
Если у вас есть _tmain
функционировать в ваших проектах вам нужно include <tchar.h>.
Тебе необходимо main()
функция, чтобы программа знала, с чего начать.
В случае, если кто-то пропустил очевидное; обратите внимание, что если вы создаете приложение с графическим интерфейсом и используете
" -subsystem: windows " в link-args, запись приложения - WinMain @ 16 . Не основной (). Следовательно, вы можете использовать этот фрагмент для вызова вашего main ():
#include <stdlib.h>
#include <windows.h>
#ifdef __GNUC__
#define _stdcall __attribute__((stdcall))
#endif
int _stdcall
WinMain (struct HINSTANCE__ *hInstance,
struct HINSTANCE__ *hPrevInstance,
char *lpszCmdLine,
int nCmdShow)
{
return main (__argc, __argv);
}
Если вы используете Visual Studio. Причина, по которой вы можете получить эту ошибку, может заключаться в том, что вы изначально создали новый заголовок file.h, а затем переименовали его в file.cpp, где вы поместили свою функцию main().
Чтобы решить эту проблему, щелкните файл file.cpp правой кнопкой мыши и выберите пункт "Свойства".
Свойства конфигурации -> Общие -> Тип элемента и измените его значение на компилятор C/C++ вместо заголовка C/C++.
Я столкнулся с ошибкой LNK2019 при работе над проектом DLL в Visual Studio 2013.
Я добавил новую конфигурацию в проект. Но вместо "Тип конфигурации" как "Динамическая библиотека" Visual Studio добавила его как "Приложение". Это привело к ошибке LNK2019.
Исправлена ошибка LNK2019: для этого выберите "Проект" -> "Свойства" -> "Свойства конфигурации" -> "Общие" и измените "Тип конфигурации" на "Динамическая библиотека (.dll)" и "Целевое расширение" на ".dll".
Да, в первоначальном вопросе говорится о проекте консоли / приложения, и эта проблема отличается от моего ответа. Но я считаю, что добавление этого ответа может помочь кому-то (как я), который наткнулся на эту тему.
Вы реализовали main()
функционировать?
int main(int argc, char **argv) {
... code ...
return 0;
}
[редактировать]
У вас есть main()
в другом исходном файле, так что вы, вероятно, забыли добавить его в свой проект.
Чтобы добавить существующий исходный файл: В обозревателе решений щелкните правой кнопкой мыши папку " Исходные файлы ", выберите " Добавить", а затем нажмите " Существующий элемент". Теперь выберите исходный файл, содержащий main()
У меня была эта проблема, несмотря на:
- иметь
main()
; а также - настройка всех других проектов в моем решении, чтобы быть статическими библиотеками.
Мое возможное исправление было следующим:
- мой
main()
был в пространстве имен, поэтому эффективно называлсяsomething::main()
... удаление этого пространства имен решило проблему.
В Visual Studio свойства проекта для конфигураций x86, x64, Release и Debug
Компоновщик> Система> Подсистема
Для
/SUBSYSTEM:WINDOWS
Требуется следующая основная строка (обратите внимание, что это для версии с расширенными символами в Юникоде):
#include <Windows.h>
int WINAPI wWinMain(_In_ HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPWSTR lpCmdLine,
int nCmdShow)
{
return 0;
}
Для
/SUBSYSTEM:CONSOLE
Требуется следующая основная:
int main(int argc, char* argv[], char* environment[]){
return 0;
}
Похоже, у вас нет основной функции, которая должна быть отправной точкой для вашей программы.
Добавлять#define SDL_MAIN_HANDLED
прежде чем включать<SDL.h>
.
Однако, если вы все еще сталкиваетесь с проблемами (как и я), возможно, это связано с тем, что ваша целевая платформа установлена на x32, но используется SDL dll x64 (мне помогло изменение платформы на x64). Если для него установлена неправильная архитектура, это может вызвать ошибку компоновщика из-за_main()
не найти.
Мой контекст: Visual Studio
У меня была такая же проблема, когда я добавил существующий файл с неправильным расширением (например, * .ccc).
Затем я изменил расширение на *.cpp. Когда я построил решение, у меня возникла аналогичная ошибка ссылки.
Я обнаружил причину, когда заглянул в файл *.vcxproject. Файл не был идентифицирован Visual Studio как исходный файл, поэтому он помещается в группу ClInclude (см. ниже).
<ItemGroup>
<ClInclude Include="toto.cpp" />
</ItemGroup>
Я перемещаю его в группу ClCompile (см. ниже) и пересобираю без ошибок.
<ItemGroup>
<ClCompile Include="AnotherSource.cpp" />
<ClCompile Include="toto.cpp" />
</ItemGroup>
Для меня проблема тоже была в SDL. Я переместил "// Сказать SDL не связываться с main()#define SDL_MAIN_HANDLED" перед включением библиотек SDL. И проблема кажется исправленной.
Моя проблема заключалась в другом. У
меня был метод в классе без реализации.
как это:
class Hello {
public:
// ...
void PrintHelloWorld();
// ...
};
Когда я вызываю метод, я получаю ошибку:
hello().PrintHelloWorld();
Ошибка: неразрешенный внешний символ LNK2019 "public: void __thiscall Hello::PrintHelloWorld(void)" ( [email protected] @@QAEXXZ), указанный в функции _main demo. \ Peyman \ source \ repos \ demo \ demo \demo.obj 1
Фактически, я использую SDK без реализации, и это вызывает ошибку. Пожалуйста, проверьте, есть ли какая-либо реализация.
void PrintHelloWorld(){}
со скобками
Перейдите к "Project-Properties-Configuration Properties-Linker-input-Additional зависимость", затем перейдите в конец и введите ";ws2_32.lib".
Попробуйте использовать return 0;
если он продолжает терпеть неудачу, измените платформу решения на 64x вместо 86x и перейдите в диспетчер конфигурации (это было, когда вы изменили 86x на 64x), а в платформе установите его на 64 бита
это работает для меня, надеюсь, это сработает для вас