关于main:C ++错误LNK2001:未解析的外部符号函数_main

C++ error LNK2001: unresolved external symbol function _main

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What is an undefined reference/unresolved external symbol error and how do I fix it?

我正在学习C++,在我的项目中有一个编译问题。我读了很多文章,标题上有这个错误,但我找不到问题所在。

我的主函数中有一个方法调用,它是导致错误的原因。每当我评论这一行时,这个项目就会完美地编译。

代码如下:

主CPP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#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();
    ...

这个方法mail->sendNow是解决这个问题的方法,所以我想我在sendmail.cpp或sendmail.h中有某种头声明问题

现在剩下的类和头:

SeNeMe.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#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

SeNeMel.CPP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#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"

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

正如您所看到的,send方法被注释掉了,所以我无法找出问题所在。

编译器输出为:

1
2
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)" (?SendNow@SendMail@@QAEXXZ) referenced in function _main    C:\Users\clanderasm\Documents\Visual Studio 2010\Projects\LandeTestConsole\LandeCplusConsole\LandeCplusConsole.obj  LandeCplusConsole


基本上,这个错误意味着你有一个你承诺要在你的头中实现的函数,但是当它到达它真正需要这个函数的部分时,它没有找到它。

如果您注释掉函数调用,那么您将实现该函数的承诺仍然存在。然而,实际上没有人在使用这个函数,所以你不履行诺言也没关系。

一旦你知道这意味着什么,就很容易找到问题所在:

您将函数定义为:

1
void SendNow()

这是一个全局函数而不是类函数,因此您没有实现您承诺实现的类函数。

您可以通过将其转换为:

1
void SendMail::SendNow()

请注意,您在Check()中有相同的问题,尽管这还没有导致错误。


你是说

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

而不是

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