Возможный дубликат:
Что такое неопределенная ссылка / неразрешенная внешняя ошибка символа и как ее исправить?
Я изучаю 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("[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_Hclass 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 pairSendMail::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
Ты имел ввиду
void SendMail::Check(int iStatus, char *szFunction)
void SendMail::SendNow()
вместо
void Check(int iStatus, char *szFunction)
void SendNow()
По сути, эта ошибка означает, что у вас есть функция, которую вы обещаете реализовать в своем заголовке, но когда она добралась до той части, где она действительно нуждалась в функции, она не нашла ее.
Если вы закомментируете вызов функции, обещание, что вы реализуете эту функцию, все еще там. Однако на самом деле никто не использует эту функцию, поэтому не имеет значения, что вы не выполняете свое обещание.
Как только вы поймете, что это значит, довольно легко найти, что не так:
Вы определяете функцию как:
void SendNow()
Это глобальная функция, а не функция класса, так как вы не реализовали функцию класса, которую обещали реализовать.
Вы можете исправить это, превратив его в:
void SendMail::SendNow()
Обратите внимание, что у вас та же проблема в Check()
хотя это еще не вызывает ошибку.