webentwicklung-frage-antwort-db.com.de

Fehler LNK2019: Nicht aufgelöstes externes Symbol _main, auf das in Funktion ___tmainCRTStartup verwiesen wird

Ich weiß nicht, was daran falsch ist. Ich kann nicht herausfinden, wo der Fehler liegt. Wenn ich die Implementierung auskommentiere, wird der Fehler auch nicht behoben.

Header-Datei

#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

Quelle

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

}
57
Caleb Jares

Selbst wenn Ihr Projekt eine main() -Methode hat, wird der Linker manchmal verwirrt. Sie können dieses Problem in Visual Studio 2010 lösen, indem Sie zu gehen

Projekt -> Eigenschaften -> Konfigurationseigenschaften -> Linker -> System

und SubSystem in Console ändern.

72
Caleb Jares

Wir hatten auch dieses Problem. Mein Kollege hat eine Lösung gefunden. Es stellte sich heraus, dass "main" in einem Bibliotheksheader eines Drittanbieters neu definiert wurde:

#define main    SDL_main

Die Lösung bestand also darin, Folgendes hinzuzufügen:

#undef main

vor unserer Hauptfunktion.

Das ist eindeutig eine Dummheit!

36
Anton Andreev

wenn Sie haben _tmain Funktion in Ihren Projekten müssen Sie include <tchar.h>.

22
engf-010

Sie benötigen eine main() -Funktion, damit das Programm weiß, wo es anfangen soll.

16
James McNellis

Für den Fall, dass jemand das Offensichtliche übersehen hat; Beachten Sie dies, wenn Sie eine GUI-Anwendung erstellen und verwenden
"-subsystem: windows"in den link-args lautet der anwendungseintrag WinMain @ 16. Nicht main (). Daher können Sie dieses Snippet verwenden, um main () aufzurufen:

#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);
}
9
G. Vanem

Haben Sie die Funktion main() implementiert?

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

[edit]

Sie haben Ihre main() in einer anderen Quelldatei, also haben Sie wahrscheinlich vergessen, sie Ihrem Projekt hinzuzufügen.

So fügen Sie eine vorhandene Quelldatei hinzu: Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Ordner Quelldateien, zeigen Sie auf Hinzufügen, und klicken Sie dann auf Vorhandenes Element. Wählen Sie nun die Quelldatei mit dem main()

6
ssmir

Wenn Sie Visual Studio verwenden. Möglicherweise erhalten Sie diesen Fehler, weil Sie ursprünglich eine neue Header-Datei erstellt haben. H und diese dann in file.cpp umbenannt haben, in der Sie Ihre main () - Funktion platziert haben.

Um das Problem zu beheben, klicken Sie mit der rechten Maustaste auf file.cpp -> klicken Sie auf Eigenschaften und gehen Sie zu
Konfigurationseigenschaften -> Allgemein -> Elementtyp und ändern Sie den Wert in C/C++ - Compiler anstelle von C/C++ - Header.

6
user5632040

Ich hatte dieses Problem trotz:

  • mit einer main(); und
  • konfigurieren aller anderen Projekte in meiner Lösung als statische Bibliotheken.

Mein letztendlicher Fix war der folgende:

  • mein main() befand sich in einem Namespace, wurde also effektiv something::main() genannt. Durch das Entfernen dieses Namespaces wurde das Problem behoben.
3
Daniel Timms

Bei der Arbeit an einem DLL -Projekt in Visual Studio 2013 ist der Fehler LNK2019 aufgetreten.

Ich habe dem Projekt eine neue Konfiguration hinzugefügt. Anstatt den "Konfigurationstyp" als "Dynamische Bibliothek" zu verwenden, fügte Visual Studio ihn als "Anwendung" hinzu. Dies führte zu dem Fehler LNK2019.

Der LNK2019-Fehler wurde behoben, indem unter Projekt -> Eigenschaften -> Konfigurationseigenschaften -> Allgemein "Konfigurationstyp" in "Dynamische Bibliothek (.dll)" und "Zielerweiterung" in ".dll" geändert wurde.

Ja, die ursprüngliche Frage handelt von einem Konsolen-/Anwendungsprojekt, bei dem es sich um ein anderes Problem handelt als bei meiner Antwort. Aber ich glaube, diese Antwort könnte jemandem (wie mir) helfen, der über diesen Thread stolpert.

3
Antony

Sie scheinen keine Hauptfunktion zu haben, die der Einstiegspunkt für Ihr Programm sein soll.

0