问题描述
当我将 winsock2 添加到我的 MinGW-w64 C/C++ 项目时,它会出错:
对“InitializeConditionVariable”的未定义引用。
注意:InitializeConditionVariable 在添加 Winsock 之前构建并运行正常。
main.c ...
#undef UNICODE
#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include "infrastructure.h"
#include "common.h"
#include "bg.h"
#include "aox.h"
#include <windows.h>
#include <ws2tcpip.h>
#include <synchapi.h>
. . .
static void mutexInit()
{
#ifdef WINDOWS
// Initialize critical sections and condition variables
InitializeCriticalSection(&iqSamplesCriticalSection);
InitializeCriticalSection(&bgBufferCriticalSection);
InitializeConditionVariable(&newSamplesAvailable); <<<<<<<<<<<<<<<<<<< ERROR: undefined reference
#else
// Initialize mutexes
pthread_mutex_init(&iqSamplesCriticalSection,NULL);
pthread_mutex_init(&bgBufferCriticalSection,NULL);
pthread_cond_init(&newSamplesAvailable,NULL);
#endif
}
解决方法
InitializeConditionVariable()
与 WinSock 无关。这完全是您自己的代码的问题。
InitializeConditionVariable()
是在 Windows Vista 中引入的。您可能只是链接到过时的 kernel32.lib
,该 {{1}} 没有公开较新的 Vista+ API。因此,您可以:
-
为您的编译器更新 Windows SDK。
-
使用 ConditionVariable functions 在运行时动态加载各种
GetProcAddress()
。