2012-11-08 31 views
7

Eventuali duplicati:
What is an undefined reference/unresolved external symbol error and how do I fix it?C++ LNK2001 di errore: non risolto funzione di simbolo esterno _main

Sto imparando C++ e ho un problema compilazione nel mio progetto. Ho letto tonnellate di messaggi con questo errore sul titolo, ma non riesco a trovare il problema.

Ho una chiamata di metodo nella mia funzione principale che è responsabile dell'errore. Ogni volta che commento la riga il progetto si compila perfetto.

Il codice è il seguente:

Main.cpp

#pragma once 
#include "stdafx.h" 
#include <iostream> 
#include <sstream> 
#include <WinSock.h> 
#include <Windows.h> 
#include <string.h> 
#include "NetUtils.h" 
#include "Utils.h" 
#include "FileUtils.h" 
#include "SendMail.h" 
using namespace std; 



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

    SendMail *mail = new SendMail("[email protected]","Envio de C++","Cuerpo del mail");  
    char* msg=""; 
    mail->SendNow(); 
    ... 

Questo metodo mail-> SendNow è quello che io commento per risolvere il problema, quindi credo che ho qualche tipo di intestazione problema dichiarazione all'interno della SendMail.cpp o SendMail.h

Ora il resto delle classi e intestazioni:

SendMail.h

#pragma once 
#ifndef SENDMAIL_H 
#define SENDMAIL_H 


class SendMail 

{ 
public: 
    SendMail(char* c_to, char* c_subject, char* c_body); 
    void Check(int iStatus, char *szFunction); 
    void SendNow(); 
    char * to; 
    char * subject; 
    char * body;  
}; 


#endif 

SendMail.cpp

#define WIN32_LEAN_AND_MEAN 

#pragma once 
#include "SendMail.h" 
#include <stdio.h> 
#include <stdlib.h> 
#include <fstream> 
#include <iostream> 
#include <windows.h> 
#include <winsock2.h> 



#pragma comment(lib, "ws2_32.lib") 
using namespace std; 

// Insist on at least Winsock v1.1 
const int VERSION_MAJOR = 1; 
const int VERSION_MINOR = 1; 

#define CRLF "\r\n"     // carriage-return/line feed pair 



SendMail::SendMail(char* c_to, char* c_subject, char* c_body) 
{ 
    to = c_to; 
    subject= c_subject; 
    body = c_body; 

} 

// Basic error checking for send() and recv() functions 
void Check(int iStatus, char *szFunction) 
{ 
    if((iStatus != SOCKET_ERROR) && (iStatus)) 
    return; 

    cerr << "Error during call to " << szFunction << ": " << iStatus << " - " << GetLastError() << endl; 
} 

void SendNow() 
{ 
    // WSADATA  WSData; 

    ///* Attempt to intialize WinSock (1.1 or later)*/ 
    // if(WSAStartup(MAKEWORD(VERSION_MAJOR, VERSION_MINOR), &WSData)) 
    // { 
    // cout << "Cannot find Winsock v" << VERSION_MAJOR << "." << VERSION_MINOR << " or later!" << endl; 
    // ErrMsg="Cannot find Winsock v"; 
    // return;  
    // } 
} 

come si può vedere il metodo Send è commentata in modo Non riesco a capire quale sia il problema.

L'output del compilatore è:

Error 6 error LNK1120: 1 unresolved externals C:\Users\clanderasm\Documents\Visual Studio 2010\Projects\LandeTestConsole\Debug\LandeCplusConsole.exe LandeCplusConsole 
Error 5 error LNK2019: unresolved external symbol "public: void __thiscall SendMail::SendNow(void)" ([email protected]@@QAEXXZ) referenced in function _main C:\Users\clanderasm\Documents\Visual Studio 2010\Projects\LandeTestConsole\LandeCplusConsole\LandeCplusConsole.obj LandeCplusConsole 
+0

'#pragma once' è per i file di intestazione; tu "# include" molto più del necessario, usi una forma non standard di 'main', usi puntatori non-const-char dove' std :: string' fa un lavoro migliore, tu mischi c-include con C++ - include : Consiglio benevolo: prendi un buon libro introduttivo. –

risposta

10

Forse cercavi

void SendMail::Check(int iStatus, char *szFunction) 
void SendMail::SendNow() 

invece di

void Check(int iStatus, char *szFunction) 
void SendNow() 
+1

Lo controllerò. Se il problema è nella dichiarazione, perché viene compilato quando commentate il metodo chiamata –

+1

@CarlosLande avete letto la domanda collegata? –

+0

Sì @Luchian Grigore. Grazie mille –

11

Fondamentalmente ciò che l'errore significa che si dispone di una funzione che si promettono di implementare nella tua intestazione, ma quando arrivò alla parte in cui effettivamente aveva bisogno della funzione, non la trovò.

Se si commenta la chiamata di funzione, la promessa di implementare tale funzione è ancora lì. Tuttavia, nessuno sta effettivamente utilizzando la funzione, quindi non importa che tu non riesca a mantenere la tua promessa.

Una volta che sai che vuol dire, è abbastanza facile trovare ciò che è sbagliato:

si definisce la funzione come:

void SendNow() 

Questa è una funzione globale e non una funzione di classe, come non hai implementato la funzione di classe che hai promesso di implementare.

È possibile risolvere questo trasformandola in:

void SendMail::SendNow() 

notano che avete lo stesso problema in Check() anche se quello non sta causando ancora un errore.

+0

Thnks per questa spiegazione dettagliata compagno –

Problemi correlati