2013-06-05 2 views
24

Прежде всего, я знаю, что этот вопрос находится на всем протяжении этого сайта, но я просмотрел почти все из них и не могу понять, что не так. Это в VS 2012. Спасибо.Неразрешенный внешний символ LNK2019

//Socket.h 
#pragma once 

#include <iostream> 
#include <WinSock2.h> 

using namespace std; 

const int STRLEN = 256; 

class Socket 
{ 
    protected: 
     WSADATA wsaData; 
     SOCKET mySocket; 
     SOCKET myBackup; 
     SOCKET acceptSocket; 
     sockaddr_in myAddress; 
    public: 
     Socket(); 
     ~Socket(); 
     bool SendData(char*); 
     bool RecvData(char*, int); 
     void CloseConnection(); 
     void GetAndSendMessage(); 
}; 

class ServerSocket : public Socket 
{ 
    public: 
     void Listen(); 
     void Bind(int port); 
     void StartHosting(int port); 
}; 

class ClientSocket : public Socket 
{ 
    public: 
     void ConnectToServer(const char *ipAddress, int port); 
}; 

Вот Socket.cpp

//Socket.cpp 


#include "stdafx.h" 
#include "Socket.h" 


Socket::Socket() 
{ 
    if(WSAStartup(MAKEWORD(2, 2), &wsaData) != NO_ERROR) 
    { 
     cerr<<"Socket Initialization: Error with WSAStartup\n"; 
     system("pause"); 
     WSACleanup(); 
     exit(10); 
    } 

    //Create a socket 
    mySocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 

    if (mySocket == INVALID_SOCKET) 
    { 
     cerr<<"Socket Initialization: Error creating socket"<<endl; 
     system("pause"); 
     WSACleanup(); 
     exit(11); 
    } 

    myBackup = mySocket; 
} 

Socket::~Socket() 
{ 
    WSACleanup(); 
} 

bool Socket::SendData(char *buffer) 
{ 
    send(mySocket, buffer, strlen(buffer), 0); 
    return true; 
} 

bool Socket::RecvData(char *buffer, int size) 
{ 
    int i = recv(mySocket, buffer, size, 0); 
    buffer[i] = '\0'; 
    return true; 
} 

void Socket::CloseConnection() 
{ 
    //cout<<"CLOSE CONNECTION"<<endl; 
    closesocket(mySocket); 
    mySocket = myBackup; 
} 

void Socket::GetAndSendMessage() 
{ 
    char message[STRLEN]; 
    cin.ignore();//without this, it gets the return char from the last cin and ignores the following one! 
    cout<<"Send > "; 
    cin.get(message, STRLEN); 
    SendData(message); 
} 

void ServerSocket::StartHosting(int port) 
{ 
    Bind(port); 
    Listen(); 
} 

void ServerSocket::Listen() 
{ 
    //cout<<"LISTEN FOR CLIENT..."<<endl; 

    if (listen (mySocket, 1) == SOCKET_ERROR) 
    { 
     cerr<<"ServerSocket: Error listening on socket\n"; 
     system("pause"); 
     WSACleanup(); 
     exit(15); 
    } 

    //cout<<"ACCEPT CONNECTION..."<<endl; 

    acceptSocket = accept(myBackup, NULL, NULL); 
    while (acceptSocket == SOCKET_ERROR) 
    { 
     acceptSocket = accept(myBackup, NULL, NULL); 
    } 
    mySocket = acceptSocket; 
} 

void ServerSocket::Bind(int port) 
{ 
    myAddress.sin_family = AF_INET; 
    myAddress.sin_addr.s_addr = inet_addr("0.0.0.0"); 
    myAddress.sin_port = htons(port); 

    //cout<<"BIND TO PORT "<<port<<endl; 

    if (bind (mySocket, (SOCKADDR*) &myAddress, sizeof(myAddress)) == SOCKET_ERROR) 
    { 
     cerr<<"ServerSocket: Failed to connect\n"; 
     system("pause"); 
     WSACleanup(); 
     exit(14); 
    } 
} 

void ClientSocket::ConnectToServer(const char *ipAddress, int port) 
{ 
    myAddress.sin_family = AF_INET; 
    myAddress.sin_addr.s_addr = inet_addr(ipAddress); 
    myAddress.sin_port = htons(port); 

    //cout<<"CONNECTED"<<endl; 

    if (connect(mySocket, (SOCKADDR*) &myAddress, sizeof(myAddress)) == SOCKET_ERROR) 
    { 
     cerr<<"ClientSocket: Failed to connect\n"; 
     system("pause"); 
     WSACleanup(); 
     exit(13); 
    } 

} 

А вот stdafx.h

#pragma once 

#include "targetver.h" 

#define WIN32_LEAN_AND_MEAN    // Exclude rarely-used stuff from Windows headers 
// Windows Header Files: 
#include <windows.h> 

// C RunTime Header Files 
#include <stdlib.h> 
#include <malloc.h> 
#include <memory.h> 
#include <tchar.h> 


// TODO: reference additional headers your program requires here 
#include "Socket.h" 

А вот мои сообщения об ошибках:

1>------ Build started: Project: Client, Configuration: Debug Win32 ------ 
1> stdafx.cpp 
1> Socket.cpp 
1> Client.cpp 
1> Generating Code... 
1>Socket.obj : error LNK2019: unresolved external symbol [email protected] referenced in function "public: void __thiscall ServerSocket::Listen(void)" ([email protected]@@QAEXXZ) 
1>Socket.obj : error LNK2019: unresolved external symbol [email protected] referenced in function "public: void __thiscall ServerSocket::Bind(int)" ([email protected]@@[email protected]) 
1>Socket.obj : error LNK2019: unresolved external symbol [email protected] referenced in function "public: void __thiscall Socket::CloseConnection(void)" ([email protected]@@QAEXXZ) 
1>Socket.obj : error LNK2019: unresolved external symbol [email protected] referenced in function "public: void __thiscall ClientSocket::ConnectToServer(char const *,int)" ([email protected]@@[email protected]) 
1>Socket.obj : error LNK2019: unresolved external symbol [email protected] referenced in function "public: void __thiscall ServerSocket::Bind(int)" ([email protected]@@[email protected]) 
1>Socket.obj : error LNK2019: unresolved external symbol [email protected] referenced in function "public: void __thiscall ServerSocket::Bind(int)" ([email protected]@@[email protected]) 
1>Socket.obj : error LNK2019: unresolved external symbol [email protected] referenced in function "public: void __thiscall ServerSocket::Listen(void)" ([email protected]@@QAEXXZ) 
1>Socket.obj : error LNK2019: unresolved external symbol [email protected] referenced in function "public: bool __thiscall Socket::RecvData(char *,int)" ([email protected]@@[email protected]) 
1>Socket.obj : error LNK2019: unresolved external symbol [email protected] referenced in function "public: bool __thiscall Socket::SendData(char *)" ([email protected]@@[email protected]) 
1>Socket.obj : error LNK2019: unresolved external symbol [email protected] referenced in function "public: __thiscall Socket::Socket(void)" ([email protected]@[email protected]) 
1>Socket.obj : error LNK2019: unresolved external symbol [email protected] referenced in function "public: __thiscall Socket::Socket(void)" ([email protected]@[email protected]) 
1>Socket.obj : error LNK2019: unresolved external symbol [email protected] referenced in function "public: __thiscall Socket::Socket(void)" ([email protected]@[email protected]) 
1>C:\Users\ajayp_000\documents\visual studio 2012\Projects\Client\Debug\Client.exe : fatal error LNK1120: 12 unresolved externals 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 
+3

Вы добавили Ws2_32.lib в свою дополнительную часть зависимостей ваших настроек Linker/Input? – drescherjm

+0

Нет ... Я попробую это и вернусь к этому сообщению – Iowa15

+3

Вы можете добавить его так: #pragma comment (lib, "Ws2_32.lib") – SChepurin

ответ

79

Проблема заключается не в связываясь с библиотекой Ws2_32.lib. Чтобы исправить это, вы можете добавить это на вкладку дополнительных зависимостей настроек компоновщика/ввода для вашего проекта. В качестве альтернативы (как было отмечено SChepurin в комментариях) вы можете добавить

#pragma comment(lib, "Ws2_32.lib") 

в исходный файл вашего проекта.

+0

У меня такая же проблема в Eclipse. Как его решить? –

+1

Eclipse - это IDE. Каков ваш компилятор? Хотя, если компилятор не является Visual Studio, я, вероятно, никак не могу помочь. – drescherjm