【问题标题】:C++ error LNK2001: unresolved external symbol function _main [duplicate]C ++错误LNK2001:未解析的外部符号函数_main [重复]
【发布时间】:2012-10-28 17:46:26
【问题描述】:

可能重复:
What is an undefined reference/unresolved external symbol error and how do I fix it?

我正在学习 C++,但我的项目中有一个编译问题。 我已经阅读了大量标题上有此错误的帖子,但我找不到问题所在。

我的 Main 函数中有一个导致错误的方法调用。每当我评论该项目编译完美的行。

代码如下:

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("somemail@mail.com","Envio de C++","Cuerpo del mail");    
    char* msg="";   
    mail->SendNow();
    ...

这个方法mail->SendNow是我评论解决问题的方法,所以我猜 我在 SendMail.cpp 或 SendMail.h 中有某种标题声明问题

现在剩下的类和头文件:

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

您可以看到方法 Send 被注释掉了,所以我无法弄清楚问题是什么。

编译器输出为:

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

【问题讨论】:

  • #pragma once 用于头文件;你#include 比必要的多,你使用main 的非标准形式,你使用非常量字符指针,而std::string 做得更好,你将c-includes 与c++-include 混合:仁慈的建议:获得一本好的入门书籍。

标签: c++ main


【解决方案1】:

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

如果您注释掉函数调用,您将实现该函数的承诺仍然存在。但是,实际上没有人使用该功能,因此您没有兑现承诺也没关系。

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

您将函数定义为:

void SendNow()

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

你可以把它变成:

void SendMail::SendNow()

请注意,您在 Check() 中遇到了同样的问题,即使这还没有导致错误。

【讨论】:

  • 感谢这个完整的解释伙伴
【解决方案2】:

你是说

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

而不是

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

【讨论】:

  • 我去看看。如果问题出在声明中,为什么在注释掉方法调用时它会编译
  • @CarlosLande 你读过链接的问题吗?
  • 是的@Luchian Grigore。非常感谢
猜你喜欢
  • 1970-01-01
  • 2012-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
  • 2018-08-14
相关资源
最近更新 更多