7

重複の可能性:
未定義の参照/未解決の外部シンボル エラーとは何ですか? また、どのように修正すればよいですか?

C++ を学習していますが、プロジェクトでコンパイルの問題があります。タイトルにこのエラーがある投稿をたくさん読みましたが、問題がどこにあるのかわかりません。

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
4

2 に答える 2

11

基本的に、そのエラーが意味するのは、ヘッダーに実装することを約束している関数があるが、実際に関数が必要な部分に到達したときに、それが見つからなかったことです。

関数呼び出しをコメントアウトしても、その関数を実装するという約束はそのままです。ただし、実際に関数を使用している人はいないので、約束を守らなくても問題ありません。

それが意味することを知ったら、何が間違っているのかを見つけるのは非常に簡単です。

関数を次のように定義しています。

void SendNow()

これはグローバル関数であり、クラス関数ではないため、実装すると約束したクラス関数を実装していません。

これを次のように変更することで修正できます。

void SendMail::SendNow()

Check()まだエラーが発生していなくても、同じ問題があることに注意してください。

于 2012-11-08T14:15:45.787 に答える
10

もしかして

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

それ以外の

void Check(int iStatus, char *szFunction)
void SendNow()
于 2012-11-08T14:11:59.617 に答える