gpt4 book ai didi

c++ - 函数 _main 中未解析的外部符号 "cSocket::cSocket(void)"

转载 作者:太空宇宙 更新时间:2023-11-04 15:27:34 25 4
gpt4 key购买 nike

#ifndef _ClientSocket_H_
#define _ClientSocket_H_

#include "Includes.h"
#include "LOGMSGs.h"

class cSocket
{
public:
cSocket();
bool Open();
bool Listen(char *OnIP,int OnPort);
void Send(char *MSG, int len);
void Recv(char *MSG,int len);
void Close();
protected:
SOCKET cSock;
const int SndBuf;
};

#endif


#include "ClientSocket.h"


bool cSocket::Open()
{
WSADATA wsaData;
int err;
if((err =WSAStartup(0x202, &wsaData)) !=0)
{
Error("Init WSAStartup() failed[%d].", err);
return false;
}
return true;
}

bool cSocket::Listen(char *OnIP,int OnPort)
{
if(Open())
{
//Create the main socket
cSock=socket(AF_INET, SOCK_STREAM, 0);
if(cSock==INVALID_SOCKET)
{
int err = WSAGetLastError();
//WSACleanup();
printf("Init socket() failed[%d].", err);
return FALSE;
}

//Set the REUSEADDR SOCKET
int optval = 1;
if(setsockopt(cSock, SOL_SOCKET, SO_REUSEADDR, (char *) &optval, sizeof(optval)))
{
int err = WSAGetLastError();
Close();
printf("Init setsockopt() SO_REUSEADDR failed[%d].", err);
return FALSE;
}

//Set the KEEPALIVE SOCKET
optval = 1;
if(setsockopt(cSock, SOL_SOCKET, SO_KEEPALIVE, (char *) &optval, sizeof(optval)))
{
int err = WSAGetLastError();
Close();
printf("Init setsockopt() SO_KEEPALIVE failed[%d].", err);
return FALSE;
}

// Set the SNDBUF SOCKET
if(SndBuf) // Non-0: pointer SNDBUG
{
optval = SndBuf;
if(setsockopt(cSock, SOL_SOCKET, SO_SNDBUF, (char *) &optval, sizeof(optval)))
{
int err = WSAGetLastError();
Close();
printf("Init setsockopt() SO_SNDBUF failed[%d].", err);
return FALSE;
}

// Read the SNDBUF SOCKET
int ret = sizeof(optval);
if(getsockopt(cSock, SOL_SOCKET, SO_SNDBUF, (char *) &optval, &ret) == 0)
{
LOGMSG("send buffer size SOCKET [%d] K.", optval/1024);
}
}

SOCKADDR_IN sin;
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = inet_addr(OnIP);
sin.sin_port = htons(OnPort);
if(bind(cSock, (LPSOCKADDR) &sin, sizeof(sin)))
{
int err = WSAGetLastError();
Close();
printf("Init bind() failed[%d].", err);
return FALSE;
}

//Set to non-blocking mode
unsigned long i = 1;
if(ioctlsocket(cSock, FIONBIO, &i))
{
int err = WSAGetLastError();
Close();
printf("Init ioctlsocket() failed[%d].", err);
return FALSE;
}

//Listening port
if(listen(cSock, SOMAXCONN)) // SOMAXCONN: WIN macro definition
{
int err = WSAGetLastError();
Close();
printf("Init listen() failed[%d].", err);
return FALSE;
}
return true;
}
return false;
}


void cSocket::Close()
{
closesocket(cSock);
WSACleanup();
}


#include "Includes.h"
#include "LOGMSGs.h"
#include "auth_proto.h"
#include "Packets.h"
#include "ClientSocket.h"


int main(int argc, char* argv[])
{
cSocket sock;
while(1)
{
sock.Open();
sock.Listen("127.0.0.1",4444);
}
return 0;
}

Error: unresolved external symbol "public: __thiscall cSocket::cSocket(void)" (??0cSocket@@QAE@XZ) referenced in function _main

怎么了?

最佳答案

这是一个链接器错误,这意味着编译器已检查代码不包含语法错误,但链接器无法找到您试图在程序中某处调用的函数的实现。在这种情况下,它找不到的函数是

__thiscall cSocket::cSocket(void)" (??0cSocket@@QAE@XZ) 

由于 name-mangling,此函数看起来很神秘,其中编译器采用函数的源代码名称,然后以允许更好的类型安全链接的方式转换它。不过还是可以看到代码处this是函数名

cSocket::cSocket(void)

这是cSocket 的构造函数。如果您注意到,代码中的任何地方都没有定义此构造函数,这就是链接器找不到它的实现的原因。通过添加实现来修改代码应该有助于解决此问题。

不过,更一般地说,如果您看到这样的错误,通常意味着您已经通过函数原型(prototype)或 extern 声明向编译器 promise 某个函数或对象存在,但您没有' 将包含其定义的目标文件提供给链接器。造成这种情况的主要原因通常是(大致按此顺序);

  1. 您制作了一个函数的原型(prototype)但忘记了实现它。我想这就是这里发生的事情。
  2. 您制作了一个函数的原型(prototype),但随后使用不同的签名实现了它。例如,如果您对函数 void MyFunction(int) 进行原型(prototype)设计,但随后将该函数实现为 void MyFunction(int&)void MyFunction(),链接器会认为这是一个重载而不是一个实现,并且会在链接时而不是编译时给你错误。
  3. 您使用定义编译了代码,但没有将其链接进来。如果您有一个多文件项目然后忘记将其中一个文件作为输入传递给链接器,则可能会发生这种情况.

希望这对您有所帮助!

关于c++ - 函数 _main 中未解析的外部符号 "cSocket::cSocket(void)",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4999796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com