在Windows上使用gcc编译时未定义对'CreateSemaphoreEx'的引用

时间:2019-06-21 04:49:13

标签: c winapi mingw-w64

我正在尝试使用gcc编译器来编译一些WinAPI代码。 但是,每当我调用诸如CreateSemaphoreEx,CreateMutexEx(以及其他一些Ex函数)之类的函数时,我都会得到 “未定义对'CreateSemaphoreEx'的引用”链接错误。 它与CreateSemaphore或CreateMutex一起使用,但不适用于这些功能的Ex版本。

首先,我使用mwindows标志进行编译(gcc main.c -mwindows) 然后,我尝试手动链接到库(gcc -lkernel32 main.c) 我也尝试过使用CreateSemaphoreExA

我还尝试卸载并重新安装mingw-w64,甚至尝试切换到TDM-GCC

我知道是否将其更改为CreateSemaphore可以正常工作,但是我想使用Ex版本。

#include <windows.h>

int main(int argc, char** argv)
{
    int initial_count = 0;
    int maximum_count = 5;

    HANDLE semaphore = CreateSemaphoreEx(0, initial_count, maximum_count, NULL, 0, SYNCHRONIZE | SEMAPHORE_MODIFY_STATE);
}

如何在Windows上使用gcc编译器访问这些WinAPI函数(如果可能的话)。

--------完成编译器输出---------

main.c: In function 'main':
main.c:8:21: warning: implicit declaration of function 'CreateSemaphoreEx'; did you mean 'CreateSemaphoreA'? [-Wimplicit-function-declaration]
  HANDLE semaphore = CreateSemaphoreEx(0, initial_count, maximum_count, NULL, 0, SYNCHRONIZE | SEMAPHORE_MODIFY_STATE);
                     ^~~~~~~~~~~~~~~~~
                     CreateSemaphoreA
main.c:8:21: warning: initialization of 'HANDLE' {aka 'void *'} from 'int' makes pointer from integer without a cast [-Wint-conversion]
C:\Users\Nexwave\AppData\Local\Temp\cc3ncRYX.o:main.c:(.text+0x49): undefined reference to `CreateSemaphoreEx'
collect2.exe: error: ld returned 1 exit status

编辑1: 我知道链接。 我的问题是mingw-w64使用的kernel32库是否不同于Microsoft链接程序使用的kernel32库。 如果不相同,那么为什么在实际的Kernel32.lib

中没有为CreateSemaphoreEx(和其他一些Ex函数)定义的定义

1 个答案:

答案 0 :(得分:0)

第一个诊断程序指示的问题:

implicit declaration of function 'CreateSemaphoreEx'

其他错误也随之而来。通常,您应该始终先解决第一个编译器诊断,然后再过多担心其他问题。

请注意,我建议使用标准编译器开关,以便针对此错误情况使用“错误”而不是“警告”,并中断编译。有些人看到“警告”一词,并认为“哦,这只是一个警告,并不重要,我会忽略它”,但是在这种情况下,这将是一个错误。


上面的错误消息表示您的系统头文件未定义CreateSemaphoreEx。为什么是这样?主要可能性如下:

  • 您使用的是旧版Windows;该功能已添加到Windows Vista中,例如,如果您使用的是XP,则将无法使用该功能。 (如果检测到系统是Vista之前的版本,则Windows标头不会定义原型和宏。)
  • 您正在使用的旧版mingw-w64没有此功能。