2012-11-08 8 views
7

Powiel możliwe:
What is an undefined reference/unresolved external symbol error and how do I fix it?C++ Błąd LNK2001: nierozwiązanych zewnętrznych funkcja symbol _MAIN

uczę się C++ i mam problem w kompilacji mojego projektu. Przeczytałem mnóstwo postów z tym błędem w tytule, ale nie mogę znaleźć, gdzie jest problem.

Mam wywołanie metody w mojej funkcji głównej, który jest odpowiedzialny za błąd. Ilekroć komentuję linię, projekt kompiluje się idealnie.

Kod jest następujący:

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(); 
    ... 

Metoda ta mail-> SendNow jest jednym mogę wypowiedzieć się rozwiązać problem, więc myślę mam jakąś problem z deklaracją nagłówka wewnątrz SendMail.cpp lub SendMail.h

Teraz pozostałe klasy i nagłówki:

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;  
    // } 
} 

Jak widać metoda Send jest wykomentowane więc nie mogę dowiedzieć się, na czym polega problem.

Wyjście Kompilator:

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' jest dla plików nagłówkowych; ty '# include' jest o wiele bardziej niż to konieczne, używasz niestandardowej formy' main', używasz nieskładkowych znaków char, gdzie 'std :: string' ma lepszą pracę, mieszasz c-zawiera z C++ - dodajesz : Życzliwa rada: Zdobądź dobrą, wstępną książkę. –

Odpowiedz

10

Czy chodziło Ci

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

zamiast

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

Sprawdzę to. Jeśli problem leży w deklaracji, dlaczego kompiluje się, gdy skomentujesz wywołanie metody –

+1

@CarlosLande Czy przeczytałeś powiązane pytanie? –

+0

Tak @Luchian Grigore. Bardzo dziękuję –

11

zasadzie to, co ten błąd oznacza to, że masz funkcję, którą obiecują implementuj w swoim nagłówku, ale kiedy dotarł do części, w której rzeczywiście potrzebował tej funkcji, nie znalazł jej.

Jeśli skomentujesz wywołanie funkcji, obietnica, że ​​będziesz realizować tę funkcję, nadal istnieje. Jednak nikt nie korzysta z tej funkcji, więc nie ma znaczenia, że ​​nie dotrzymasz swojej obietnicy.

Gdy wiesz, że to znaczy, że to całkiem łatwe do znalezienia, co jest nie tak:

definiowania funkcji jak:

void SendNow() 

Jest to funkcja globalna i nie jest funkcją klasy, jak nie wdrożyłeś funkcji klasy, którą obiecałeś wprowadzić.

Można rozwiązać ten problem poprzez przekształcenie go:

void SendMail::SendNow() 

Należy pamiętać, że masz ten sam problem w Check() mimo że nie jest przyczyną jeszcze błąd.

+0

Thnks za ten kompletny partner wyjaśniający –

Powiązane problemy