【问题标题】:unresolved external symbol "cSocket::cSocket(void)" in function _main函数_main中未解析的外部符号“cSocket::cSocket(void)”
【发布时间】:2011-06-27 08:29:27
【问题描述】:
#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;
}

错误:函数_main中引用的未解析的外部符号“public: __thiscall cSocket::cSocket(void)”(??0cSocket@@QAE@XZ)

怎么了?

【问题讨论】:

  • 我已回滚您对问题的更改。请留下代码和所有内容的问题,以便如果将来有人遇到同样的问题,他们可能会看到您的问题和下面的答案,这可能会对他们有所帮助

标签: c++ visual-c++ constructor linker


【解决方案1】:

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

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

这个函数看起来很神秘,因为 name-mangling,编译器获取函数的源代码名称,然后以允许更好的类型安全链接的方式对其进行转换。但是,你仍然可以看到在代码中 this 是函数名

cSocket::cSocket(void)

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

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

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

希望这会有所帮助!

【讨论】:

  • @templatetypedef 是的,它帮了很多忙,但是如果我不想使用构造函数怎么办,它会一直强迫我使用它,我检查了我的代码并且我已经使用了所有东西,并且原型都是很好的 idk怎么了:S
  • @MixedCoder-“不使用构造函数”是什么意思?如果您没有为类定义构造函数,C++ 将自动为您生成一个仅默认初始化该类的所有成员的构造函数。也许这就是你想要的?
  • @MixedCoder-我不确定我是否理解您的最后回复-“完全”是否意味着“这正是我想要的?”你能更具体一点我可以帮助你吗?我想帮忙,但我认为我不完全理解您遇到了什么问题。
  • @templatetypedef- 如果我没有使用构造函数,它会要求我制作一个,如果我尝试制作一个它说IntelliSense: "cSocket::cSocket()" provides no initializer for:,如果我使用一个空的构造函数,它会给我上面的错误
  • @MixedCoder- 啊!我想我看到了问题。您的班级中有一个 const 数据成员 (const int SndBuf)。如果您有一个 const 数据成员,则必须在构造函数内的成员初始化列表中对其进行初始化。然后,您的选择是要么在此处删除 const 限定符,要么定义一个使用以下内容设置值的构造函数:cSocket::cSocket(int value) : SndBuf(value) { ... }。请注意,如果您将其保留为 const 成员,则必须使用成员初始化列表来设置此值。
【解决方案2】:

你没有声明构造函数定义

cSocket::cSocket()
{
    //your init code here
}

如果您不打算使用构造函数,则只需从类声明中删除行 cSocket();

【讨论】:

  • 我做到了,我得到了:错误 C2512:'cSocket':没有合适的默认构造函数可用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多