web-dev-qa-db-ja.com

C ++エラーLNK2001:未解決の外部シンボル関数_main

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

私は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("[email protected]","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
7
Carlos Landeras

もしかして

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

の代わりに

void Check(int iStatus, char *szFunction)
void SendNow()
10
Luchian Grigore

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

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

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

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

_void SendNow()
_

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

これを修正するには、次のようにします。

_void SendMail::SendNow()
_

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

11
Jasper