c++ - risolti - lnk2019 unresolved external symbol




errore LNK2019: simbolo esterno non risolto_main referenziato nella funzione___tmainCRTStartup (8)

Abbiamo anche avuto questo problema. Il mio collega ha trovato una soluzione. Si è rivelata una ridefinizione di "main" in un'intestazione di libreria di terze parti:

#define main    SDL_main

Quindi la soluzione era di aggiungere:

#undef main

prima della nostra funzione principale.

Questa è chiaramente una stupidità!

Non so cosa c'è che non va .. Non riesco a trovare dove si trova l'errore, commentare l'implementazione non risolve l'errore.

File di intestazione

#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

fonte

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

}

Anche se il tuo progetto ha un metodo main() , il linker a volte viene confuso. Puoi risolvere questo problema in Visual Studio 2010 andando a

Progetto -> Proprietà -> Proprietà di configurazione -> Linker -> Sistema

e cambiare il SubSystem in console.


Hai implementato la funzione main() ?

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

[modificare]

Hai il tuo main() in un altro file sorgente, quindi probabilmente hai dimenticato di aggiungerlo al tuo progetto.

Per aggiungere un file sorgente esistente: in Esplora soluzioni , fare clic con il pulsante destro del mouse sulla cartella File di origine , selezionare Aggiungi , quindi fare clic su Articolo esistente . Ora seleziona il file sorgente contenente il main()


Ho avuto questo problema nonostante:

  • avere un main() ; e
  • configurare tutti gli altri progetti nella mia soluzione come librerie statiche.

La mia eventuale correzione era la seguente:

  • il mio main() era in uno spazio dei nomi, quindi è stato effettivamente chiamato something::main() ... rimuovendo questo namespace risolto il problema.

Nel caso in cui qualcuno ha mancato l'ovvio; si noti che se si crea un'applicazione GUI e si utilizza
" -subsystem: windows " nel link-args, la voce dell'applicazione è WinMain @ 16 . Non principale () . Quindi puoi usare questo snippet per chiamare il tuo 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);
}


Se stai usando Visual Studio. Il motivo per cui potresti ricevere questo errore potrebbe essere dovuto al fatto che in origine hai creato un nuovo file di intestazione.h e poi lo hai rinominato in file.cpp in cui hai inserito la tua funzione main ().

Per risolvere il problema, fai clic con il pulsante destro del mouse su file.cpp -> fai clic su Proprietà vai a
Proprietà di configurazione -> Generale -> Tipo di oggetto e modifica il suo valore nel compilatore C / C ++ anziché nell'intestazione C / C ++.


andare su "Proprietà progetto - Proprietà di configurazione - Linker - input - Altre dipendenze", quindi andare alla fine e digitare "; ws2_32.lib".


se hai _tmain nei tuoi progetti devi include <tchar.h>.





linker