我正在尝试使用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函数)定义的定义答案 0 :(得分:0)
第一个诊断程序指示的问题:
implicit declaration of function 'CreateSemaphoreEx'
其他错误也随之而来。通常,您应该始终先解决第一个编译器诊断,然后再过多担心其他问题。
请注意,我建议使用标准编译器开关,以便针对此错误情况使用“错误”而不是“警告”,并中断编译。有些人看到“警告”一词,并认为“哦,这只是一个警告,并不重要,我会忽略它”,但是在这种情况下,这将是一个错误。
上面的错误消息表示您的系统头文件未定义CreateSemaphoreEx
。为什么是这样?主要可能性如下: