将 Winsock2 添加到我的 MinGW-w64 C/C++ 原因:未定义对 `InitializeConditionVariable' 的引用

问题描述

当我将 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。因此,您可以: