【问题标题】:Error while implementing the "Singleton" pattern [duplicate]实施“单例”模式时出错[重复]
【发布时间】:2015-11-14 13:51:47
【问题描述】:

我在尝试在 C++ 中实现 单例模式遇到以下问题

  • 外部符号未解析 __imp_WSAStartup 在函数“private: __cdecl MaWinsock::MaWinsock(void)”(??0MaWinsock@@AEAA@XZ) 中引用)
  • 函数"public: __cdecl MaWinsock::~MaWinsock(void)" (??1MaWinsock@@QEAA@XZ) 中引用的外部符号未解析 __imp_WSACleanup

这里是 MaWinsock.h

    #include <WinSock2.h>

    class MaWinsock
    {
        WSADATA wsaData;    //  structure contenant les données de la librairie winsock à initialiser. représente la DLL.
        MaWinsock(void);

        static MaWinsock *instanceUnique;
    public:
        static MaWinsock *getInstance();
        ~MaWinsock(void);
    };

这里是 MaWinsock.cpp

    #include <iostream>
    #include "Exception.h"
    #include "MaWinsock.h"


    using namespace std;

    /* static */   MaWinsock* MaWinsock::instanceUnique = NULL;

    /* static */ MaWinsock* MaWinsock::getInstance()
    {
        if (!instanceUnique) instanceUnique = new MaWinsock;
        return instanceUnique;
    }


    MaWinsock::MaWinsock(void)
    {

        int r;

        r = WSAStartup(MAKEWORD(2, 0), &wsaData);       // MAKEWORD(2,0) sert à indiquer la version de la librairie à utiliser : 1 pour winsock et 2 pour winsock2

                                                        /* en cas de succès, wsaData a été initialisée et l'appel a renvoyé la valeur 0 */

        if (r) throw Exception("L'initialisation a échoué");

        cout << "initialisation winsock effectuée" << endl;
    }


    MaWinsock::~MaWinsock(void)
    {
        WSACleanup();
        cout << "libération des ressources de la winsock effectuée" << endl;
    }

非常奇怪的是,在另一个相关项目中,这段代码运行良好,但在这里,我无法弄清楚问题出在哪里。

如果你们当中有人熟悉这种模式,我们将不胜感激。

谢谢

【问题讨论】:

  • 我猜您没有链接到 Winsock 库 (ws_32.lib),因此无法解析这些函数。你能确定你链接到这个库吗?
  • 是的,就是这样。我发布了答案。这是 Visual c++ 特有的。

标签: c++


【解决方案1】:

为了让它工作,你应该在你的 cpp 文件中添加这一行:

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

【讨论】:

  • 感谢一些cmets,我找到了我的问题的答案,所以我发布了它。因此,如果将来其他人有同样的错误,他们会知道如何解决它......就这么简单.
  • 人们已经知道如何解决这个问题,因为这个问题是重复的。另外,这个问题根本与单例无关,所以你的问题标题会让人们感到困惑。您可能会对此提出异议,只需说明您的问题与重复的问题在哪里不同,以便可以重新打开。
猜你喜欢
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
  • 2018-06-07
  • 2018-12-12
  • 2013-07-05
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
相关资源
最近更新 更多