【发布时间】: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++