Windows 套接字封装 - 未解析的外部符号

Posted

技术标签:

【中文标题】Windows 套接字封装 - 未解析的外部符号【英文标题】:Windows Socket Encapsulation - Unresolved external symbol 【发布时间】:2016-04-06 09:29:40 【问题描述】:

我正在学习 winsockets,在构造函数中调用 socket(af, type, protocol) 函数时出现链接器错误。

main.cpp

#include "Server.h"

int main(int argc, char **argv) 
    nmd::Server *server = new nmd::Server();

    //TODO: Logic

    delete server;
    server = nullptr;
    return 0;

服务器.h

#pragma once

#include <WinSock2.h>
#include <WS2tcpip.h>

namespace nmd 
class Server 
public:
    Server();
    virtual ~Server();
private:
    SOCKET socket_;
;

服务器.cpp

#include "Server.h"

nmd::Server::Server() 
    socket_ = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (INVALID_SOCKET == socket_)
        throw 1; // TODO: proper exception handling


nmd::Server::~Server() 

当我尝试构建它时,出现未解决的外部符号错误。详细:

LNK2019 unresolved external symbol __imp__socket@12 referenced in function "public: __thiscall nmd::Server::Server(void)" (??0Server@nmd@@QAE@XZ)

我在这里缺少什么?我想知道这个问题的根源,而不仅仅是解决方案。当我将 socket(...) 函数放入其中时,是什么让编译器相信 nmd::Server::Server() 未定义?

【问题讨论】:

【参考方案1】:

您需要在链接器命令中添加Ws2_32.lib 以解析该函数​​。

【讨论】:

Maaaan,我刚刚在另一个项目中做到了这一点,然后才意识到。解决了,谢谢:)【参考方案2】:

当您将套接字初始化放在初始化器列表中时,请检查它是否有效:

nmd::Server::Server(): socket_(AF_INET, SOCK_STREAM, IPPROTO_TCP)

    if (INVALID_SOCKET == socket_)
        throw 1; // TODO: proper exception handling

【讨论】:

这在语法上是不正确的,我的朋友 :( SOCKET 没有这样的 c-tor,或者我不明白你在做什么?!

以上是关于Windows 套接字封装 - 未解析的外部符号的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 64 中编译 32 位应用程序时未解析的外部符号

错误 LNK2019:未解析的外部符号 opencv

IAudioClient::Initialize 方法的未解析外部符号。 WASAPI API

错误 LNK2019:matlab 中未解析的外部符号

从 C++ 连接 MySQL:错误 LNK2001:未解析的外部符号 [重复]

dcmtk lnk2019 无法解析外部符号