Питання помилка 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];
    }

}

50
2018-01-30 20:43


походження


Це посилання помилка Схоже, ви намагаєтеся створити виконуваний файл без a main() функція Ви повинні або будувати бібліотеку, або ж вам потрібен вихідний файл з main() в цьому. - Paul R
Nitpick: якщо хочете size_t, ви повинні використовувати <cstddef> а не <cstdlib>. - Billy ONeal
@Billy: size_t визначається в обох заголовках. - James McNellis
У мене є основна функція в іншому файлі, це тестова програма, надана підручником. int main () {...} Я не знаю, що я повинен зробити, щоб програма її визнала - Caleb Jares
У мене подібна проблема викликала незначне незнання, не вибравши x64 build, тоді як lib включений x64. - Pervez Alam


Відповіді:


Навіть якщо ваш проект має main() метод, посилання іноді плутають. Ви можете вирішити цю проблему в Visual Studio 2010, перейшовши до

Проект -> Властивості -> Властивості конфігурації -> Лінкер -> Система

і змінюється SubSystem  для консолі.


67
2017-10-14 16:26



SubSystem вже встановлений для Console для мене, і у мене є присутня функція main (). У вас є якась інша ідея? - rfcoder89
Спробуйте очистити та відновити своє рішення. - Caleb Jares
Спасибі, проблема полягала в тому, що я мав основну функцію всередині простору імен lol. - rfcoder89
Я мав точно протилежне (консоль встановлений замість Windows), тому я переключився, і це працювало. Ваше рішення допомогло мені в будь-якому разі досягти правильного шляху. Дякую ! - Vahron
Я просто вирішив подібну помилку, змінивши console в windows :) - LCFactorization


У нас також була ця проблема. Мій колега знайшов рішення. Виявилося, що це перевизначення "основного" в заголовку сторонньої бібліотеки:

#define main    SDL_main

Отже, рішення було додати:

#undef main

перед нашою головною функцією.

Це, безумовно, дурість!


31
2018-05-12 11:45



Спасибі, це було винуватцем для мене теж! Це краще рішення для ініціалізації SDL належним чином, хоча. - Csq
Ага це просто для мене теж працювало. Використання SDL2.0.3 та GLEW1.13.0. - Nick Desaulniers
О, у SDL_main.h, є коментар про "Перевизначити main () на деяких платформах, так що це називається SDL". потім: #ifdef WIN32 #def SDL_MAIN_AVAILABLE #endif ... #if визначено (SDL_MAIN_NEEDED) || визначено (SDL_MAIN_AVAILABLE) #define main SDL_main #endif Як сказав @Csq, виглядає, що існує кращий спосіб ініціалізації SDL2. - Nick Desaulniers
@Nick Desaulniers Просто воював через цю проблему і вирішив згідно з цією відповіддю. Що означає "виглядає як існує кращий спосіб ініціалізувати SDL2"? Дякую. - Chris
Це була моя проблема! Дякуємо за виявлення цієї химерної речі. Написання "#undef main" безпосередньо перед справжньою основною функцією вирішена ця помилка лінкера - Anonymous


якщо у вас є _tmain функція у ваших проектах вам потрібно include <tchar.h>.


23
2018-01-30 21:00



У мене є основна функція в іншому файлі, це тестова програма, надана підручником. int main () {...} Я не знаю, що я повинен зробити, щоб програма її визнала - Caleb Jares


Вам потрібно а main() функція, тому програма знає, з чого почати.


16
2018-01-30 20:46



У мене є основна функція в іншому файлі, це тестова програма, надана підручником. int main () {...} Я не знаю, що я повинен зробити, щоб програма її визнала - Caleb Jares
Тепер скомпілюйте та створюйте два вихідні файли, тобто g++ main.cpp sequence1.cpp -o result.out - Mahesh
@ cable729: Ви додали обидва файли .cpp до одного проекту в Visual Studio? - James McNellis
Я зрозумів, що в властивостях проекту під посиланням він встановлений на Windows, а не консоль. Дякую за допомогу - Caleb Jares
@ cable729: The main Функція, яка є точкою входу програми, повинна бути в глобальному просторі імен. Ви не можете помістити його в будь-який інший простір імен, і ви не можете використовувати директиву з використання, щоб принести деякі інші main функція в глобальний простір імен. - James McNellis


У випадку, якщо хтось пропустив очевидне; Зауважте, що якщо ви створите графічний інтерфейс та застосуєте
"-система: вікна"у аргументі link-запису додаток є WinMain @ 16. Не основний (). Отже, ви можете використовувати цей фрагмент, щоб викликати ваш основний ():

#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);
}


8
2017-08-24 18:35





Ви реалізували main() функція

int main(int argc, char **argv) {
    ... code ...
    return 0;
}

[ред.]

Ти маєш main() в іншому вихідному файлі, тому ви, напевно, забули додати його до вашого проекту.

Додавання існуючого вихідного файлу: In Solution Explorer, клацніть правою кнопкою миші Вихідні файли папка, вкажіть на Додати, а потім натисніть кнопку Існуючий предмет. Тепер виберіть вихідний файл, що містить main()


6
2018-01-30 20:47



У мене є основна функція в іншому файлі, це тестова програма, надана підручником. int main () {...} Я не знаю, що я повинен зробити, щоб програма її визнала - Caleb Jares
@ cable729 Ви, ймовірно, використовуєте Visual C ++. Тоді ви повинні додати файл з main() до списку вихідних файлів проекту. Інший варіант - скопіювати та вставити ваш main() до вашої sequence1.cpp. - ssmir
@ cable729 Я оновив мою відповідь - ssmir


Якщо ви використовуєте Visual Studio. Причина, чому ви можете отримати цю помилку, може бути тому, що ви спочатку створили новий файл заголовка.h, а потім перейменував його в файл file.cpp, де ви розмістили основну () функцію.

Щоб вирішити проблему, клацніть файл file.cpp -> натисніть Властивості йти до
Властивості конфігурації -> Загальні -> Тип елемента та змініть його значення на C / C ++, замість заголовка C / C ++.


4
2017-12-02 19:42





Я мав цю проблему незважаючи на:

  • що має main(); і
  • налаштовуючи всі інші проекти в моєму рішенні статичними бібліотеками.

Моє можливе виправлення було наступним:

  • мій main() був у просторі імен, тому його називали ефективно something::main() ... видалення цієї простору імен вирішило проблему.

3
2018-06-19 09:48



Це воно! Спасибі людині. - Lanaru


Я зіткнувся з помилкою LNK2019 під час роботи над проектом DLL у Visual Studio 2013.

Я додав нову конфігурацію до проекту. Але замість того, щоб мати "Тип конфігурації" як "Динамічна бібліотека", візуальна студія додала її як "додаток". Це призвело до помилки LNK2019.

Виправлено помилку LNK2019, перейшовши в меню «Проект -> Властивості -> Властивості конфігурації -> Загальні» та змінити «Тип конфігурації» на «Динамічна бібліотека (.dll)» та «Розширення цільового призначення» на «.dll».

Так, оригінальне питання говорить про проект консолі / програми, що є іншою проблемою, ніж моя відповідь. Але я вважаю, що додавання цієї відповіді може допомогти комусь (як я), який спотикається на цю тему.


1
2017-11-25 14:02



Працює! Просто переконайтеся, що ви використовуєте правильну конфігурацію сборки. Обидва Debug і Release в цьому діалозі повинні бути змінені в vs2015. - Edza
Крім того, обов'язково додайте шлях бібліотеки до свого рішення - Liger


Ви, мабуть, не мають основної функції, яка, як передбачається, є початковою точкою для вашої програми.


0
2018-01-30 20:46



У мене є основна функція в іншому файлі, це тестова програма, надана підручником. int main () {...} Я не знаю, що я повинен зробити, щоб програма її визнала - Caleb Jares